mirror of
https://bitbucket.org/mfeemster/fractorium.git
synced 2025-02-23 05:21:33 -05:00
Initial source commit
Initial source commit
This commit is contained in:
parent
1493c22925
commit
ef56c16b2b
315
Builds/MSVC/VS2010/Ember.vcxproj
Normal file
315
Builds/MSVC/VS2010/Ember.vcxproj
Normal file
@ -0,0 +1,315 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="ReleaseNvidia|Win32">
|
||||||
|
<Configuration>ReleaseNvidia</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="ReleaseNvidia|x64">
|
||||||
|
<Configuration>ReleaseNvidia</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}</ProjectGuid>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<RootNamespace>EmberNs</RootNamespace>
|
||||||
|
<ProjectName>Ember</ProjectName>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;BUILDING_EMBER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||||
|
<DisableSpecificWarnings>4251;4661</DisableSpecificWarnings>
|
||||||
|
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\libxml2\include;$(ProjectDir)..\..\..\..\tbb\include</AdditionalIncludeDirectories>
|
||||||
|
<StructMemberAlignment>Default</StructMemberAlignment>
|
||||||
|
<PrecompiledHeaderFile>EmberPch.h</PrecompiledHeaderFile>
|
||||||
|
<StringPooling>true</StringPooling>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;BUILDING_EMBER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||||
|
<DisableSpecificWarnings>4251;4661</DisableSpecificWarnings>
|
||||||
|
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\libxml2\include;$(ProjectDir)..\..\..\..\tbb\include</AdditionalIncludeDirectories>
|
||||||
|
<StructMemberAlignment>Default</StructMemberAlignment>
|
||||||
|
<PrecompiledHeaderFile>EmberPch.h</PrecompiledHeaderFile>
|
||||||
|
<FloatingPointModel>Precise</FloatingPointModel>
|
||||||
|
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
<StringPooling>true</StringPooling>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BUILDING_EMBER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||||
|
<DisableSpecificWarnings>4251;4661</DisableSpecificWarnings>
|
||||||
|
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\libxml2\include;$(ProjectDir)..\..\..\..\tbb\include</AdditionalIncludeDirectories>
|
||||||
|
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||||
|
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||||
|
<PrecompiledHeaderFile>EmberPch.h</PrecompiledHeaderFile>
|
||||||
|
<StringPooling>true</StringPooling>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BUILDING_EMBER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||||
|
<DisableSpecificWarnings>4251;4661</DisableSpecificWarnings>
|
||||||
|
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\libxml2\include;$(ProjectDir)..\..\..\..\tbb\include</AdditionalIncludeDirectories>
|
||||||
|
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||||
|
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||||
|
<PrecompiledHeaderFile>EmberPch.h</PrecompiledHeaderFile>
|
||||||
|
<StringPooling>true</StringPooling>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BUILDING_EMBER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||||
|
<DisableSpecificWarnings>4251;4661</DisableSpecificWarnings>
|
||||||
|
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\libxml2\include;$(ProjectDir)..\..\..\..\tbb\include</AdditionalIncludeDirectories>
|
||||||
|
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||||
|
<PrecompiledHeaderFile>EmberPch.h</PrecompiledHeaderFile>
|
||||||
|
<StringPooling>true</StringPooling>
|
||||||
|
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
<FloatingPointModel>Precise</FloatingPointModel>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BUILDING_EMBER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||||
|
<DisableSpecificWarnings>4251;4661</DisableSpecificWarnings>
|
||||||
|
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\libxml2\include;$(ProjectDir)..\..\..\..\tbb\include</AdditionalIncludeDirectories>
|
||||||
|
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||||
|
<PrecompiledHeaderFile>EmberPch.h</PrecompiledHeaderFile>
|
||||||
|
<StringPooling>true</StringPooling>
|
||||||
|
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
<FloatingPointModel>Precise</FloatingPointModel>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="ReadMe.txt" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Affine2D.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\CarToRas.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\EmberDefines.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\EmberPch.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Ember.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\DensityFilter.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Interpolate.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\PaletteList.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Renderer.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\SpatialFilter.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Iterator.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Palette.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Point.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\TemporalFilter.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\EmberToXml.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\SheepTools.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Utils.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Variation.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\VariationList.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Variations01.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Variations02.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Variations03.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Variations04.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Variations05.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\VariationsDC.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Xform.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Isaac.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Timing.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\XmlToEmber.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\..\Source\Ember\Affine2D.cpp" />
|
||||||
|
<ClCompile Include="..\..\..\Source\Ember\DllMain.cpp" />
|
||||||
|
<ClCompile Include="..\..\..\Source\Ember\Ember.cpp" />
|
||||||
|
<ClCompile Include="..\..\..\Source\Ember\EmberPch.cpp">
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Create</PrecompiledHeader>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Ember\Renderer.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\..\..\libxml2\win32\VC10\libxml2.vcxproj">
|
||||||
|
<Project>{1d6039f6-5078-416f-a3af-a36efc7e6a1c}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\..\..\tbb\build\vs2010\tbb.vcxproj">
|
||||||
|
<Project>{f62787dd-1327-448b-9818-030062bcfaa5}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
131
Builds/MSVC/VS2010/Ember.vcxproj.filters
Normal file
131
Builds/MSVC/VS2010/Ember.vcxproj.filters
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files\Xml">
|
||||||
|
<UniqueIdentifier>{bc119dca-b280-4071-b72d-f8c377b2e192}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files\Filters">
|
||||||
|
<UniqueIdentifier>{39f9b624-d25e-4af7-9f76-3b1a36a8a0f5}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files\Variations">
|
||||||
|
<UniqueIdentifier>{1ae77918-b5ee-4186-9fec-802fed55144e}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="ReadMe.txt" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Timing.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Isaac.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\EmberPch.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Interpolate.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Iterator.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Palette.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\PaletteList.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Point.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Renderer.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Utils.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Xform.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\DensityFilter.h">
|
||||||
|
<Filter>Header Files\Filters</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\SpatialFilter.h">
|
||||||
|
<Filter>Header Files\Filters</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\TemporalFilter.h">
|
||||||
|
<Filter>Header Files\Filters</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\EmberToXml.h">
|
||||||
|
<Filter>Header Files\Xml</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\XmlToEmber.h">
|
||||||
|
<Filter>Header Files\Xml</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\CarToRas.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\EmberDefines.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Ember.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Affine2D.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\SheepTools.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Variation.h">
|
||||||
|
<Filter>Header Files\Variations</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\VariationList.h">
|
||||||
|
<Filter>Header Files\Variations</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Variations01.h">
|
||||||
|
<Filter>Header Files\Variations</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Variations02.h">
|
||||||
|
<Filter>Header Files\Variations</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Variations03.h">
|
||||||
|
<Filter>Header Files\Variations</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Variations04.h">
|
||||||
|
<Filter>Header Files\Variations</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\Variations05.h">
|
||||||
|
<Filter>Header Files\Variations</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Ember\VariationsDC.h">
|
||||||
|
<Filter>Header Files\Variations</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\..\Source\Ember\DllMain.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Ember\Ember.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Ember\EmberPch.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Ember\Affine2D.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Ember\Renderer.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
335
Builds/MSVC/VS2010/EmberAnimate.vcxproj
Normal file
335
Builds/MSVC/VS2010/EmberAnimate.vcxproj
Normal file
@ -0,0 +1,335 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="ReleaseNvidia|Win32">
|
||||||
|
<Configuration>ReleaseNvidia</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="ReleaseNvidia|x64">
|
||||||
|
<Configuration>ReleaseNvidia</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{35285FCF-6FA8-410E-841B-70AE744D38B8}</ProjectGuid>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<RootNamespace>EmberAnimate</RootNamespace>
|
||||||
|
<ProjectName>EmberAnimate</ProjectName>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb_debug.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb_debug.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb_debug.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb_debug.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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;$(CUDA_PATH)include</AdditionalIncludeDirectories>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\..\..\Source\Fractorium\Icons\Fractorium.ico" />
|
||||||
|
<None Include="ReadMe.txt" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\..\..\libjpeg\jpeg.vcxproj">
|
||||||
|
<Project>{019dbd2a-273d-4ba4-bf86-b5efe2ed76b1}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\..\..\libpng\projects\vstudio\libpng\libpng.vcxproj">
|
||||||
|
<Project>{d6973076-9317-4ef2-a0b8-b7a18ac0713e}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\..\..\libxml2\win32\VC10\libxml2.vcxproj">
|
||||||
|
<Project>{1d6039f6-5078-416f-a3af-a36efc7e6a1c}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\..\..\tbb\build\vs2010\tbb.vcxproj">
|
||||||
|
<Project>{f62787dd-1327-448b-9818-030062bcfaa5}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="Ember.vcxproj">
|
||||||
|
<Project>{2bdb7a54-bb1a-476b-a6e5-f81e90ad4e67}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="EmberCL.vcxproj">
|
||||||
|
<Project>{f6a9102c-69a9-48fb-bc4b-49e49af43236}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberAnimate\EmberAnimate.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberAnimate\resource.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberCommon.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberCommonPch.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberOptions.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\JpegUtils.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\SimpleGlob.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\SimpleOpt.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberAnimate\EmberAnimate.cpp" />
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCommon\EmberCommonPch.cpp">
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Create</PrecompiledHeader>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ResourceCompile Include="..\..\..\Source\EmberAnimate\EmberAnimate.rc" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
62
Builds/MSVC/VS2010/EmberAnimate.vcxproj.filters
Normal file
62
Builds/MSVC/VS2010/EmberAnimate.vcxproj.filters
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Resource Files">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="ReadMe.txt" />
|
||||||
|
<None Include="..\..\..\Source\Fractorium\Icons\Fractorium.ico">
|
||||||
|
<Filter>Resource Files</Filter>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberCommonPch.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\JpegUtils.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\SimpleGlob.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\SimpleOpt.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberCommon.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberOptions.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberAnimate\EmberAnimate.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberAnimate\resource.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCommon\EmberCommonPch.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberAnimate\EmberAnimate.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ResourceCompile Include="..\..\..\Source\EmberAnimate\EmberAnimate.rc">
|
||||||
|
<Filter>Resource Files</Filter>
|
||||||
|
</ResourceCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
304
Builds/MSVC/VS2010/EmberCL.vcxproj
Normal file
304
Builds/MSVC/VS2010/EmberCL.vcxproj
Normal file
@ -0,0 +1,304 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="ReleaseNvidia|Win32">
|
||||||
|
<Configuration>ReleaseNvidia</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="ReleaseNvidia|x64">
|
||||||
|
<Configuration>ReleaseNvidia</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{F6A9102C-69A9-48FB-BC4B-49E49AF43236}</ProjectGuid>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<RootNamespace>EmberCLns</RootNamespace>
|
||||||
|
<ProjectName>EmberCL</ProjectName>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;BUILDING_EMBERCL;AMD_OS_WIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||||
|
<DisableSpecificWarnings>4251;4661</DisableSpecificWarnings>
|
||||||
|
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\Source\Ember\;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)include</AdditionalIncludeDirectories>
|
||||||
|
<StructMemberAlignment>Default</StructMemberAlignment>
|
||||||
|
<PrecompiledHeaderFile>EmberCLPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>opencl.lib;Opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;BUILDING_EMBERCL;AMD_OS_WIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||||
|
<DisableSpecificWarnings>4251;4661</DisableSpecificWarnings>
|
||||||
|
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\Source\Ember\;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)include</AdditionalIncludeDirectories>
|
||||||
|
<StructMemberAlignment>Default</StructMemberAlignment>
|
||||||
|
<PrecompiledHeaderFile>EmberCLPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>opencl.lib;Opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BUILDING_EMBERCL;AMD_OS_WIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||||
|
<DisableSpecificWarnings>4251;4661</DisableSpecificWarnings>
|
||||||
|
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\Source\Ember\;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)include</AdditionalIncludeDirectories>
|
||||||
|
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||||
|
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||||
|
<PrecompiledHeaderFile>EmberCLPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BUILDING_EMBERCL;AMD_OS_WIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||||
|
<DisableSpecificWarnings>4251;4661</DisableSpecificWarnings>
|
||||||
|
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\Source\Ember\;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)include</AdditionalIncludeDirectories>
|
||||||
|
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||||
|
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||||
|
<PrecompiledHeaderFile>EmberCLPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BUILDING_EMBERCL;AMD_OS_WIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||||
|
<DisableSpecificWarnings>4251;4661</DisableSpecificWarnings>
|
||||||
|
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\Source\Ember\;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)include</AdditionalIncludeDirectories>
|
||||||
|
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||||
|
<PrecompiledHeaderFile>EmberCLPch.h</PrecompiledHeaderFile>
|
||||||
|
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
<FloatingPointModel>Precise</FloatingPointModel>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BUILDING_EMBERCL;AMD_OS_WIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||||
|
<DisableSpecificWarnings>4251;4661</DisableSpecificWarnings>
|
||||||
|
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\Source\Ember\;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libxml2\include;$(CUDA_PATH)include</AdditionalIncludeDirectories>
|
||||||
|
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||||
|
<PrecompiledHeaderFile>EmberCLPch.h</PrecompiledHeaderFile>
|
||||||
|
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
<FloatingPointModel>Precise</FloatingPointModel>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="ReadMe.txt" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\..\..\tbb\build\vs2010\tbb.vcxproj">
|
||||||
|
<Project>{f62787dd-1327-448b-9818-030062bcfaa5}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="Ember.vcxproj">
|
||||||
|
<Project>{2bdb7a54-bb1a-476b-a6e5-f81e90ad4e67}</Project>
|
||||||
|
<Private>true</Private>
|
||||||
|
<ReferenceOutputAssembly>true</ReferenceOutputAssembly>
|
||||||
|
<CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
|
||||||
|
<LinkLibraryDependencies>true</LinkLibraryDependencies>
|
||||||
|
<UseLibraryDependencyInputs>false</UseLibraryDependencyInputs>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCL\DllMain.cpp">
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Create</PrecompiledHeader>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCL\FinalAccumOpenCLKernelCreator.cpp" />
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCL\DEOpenCLKernelCreator.cpp" />
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCL\IterOpenCLKernelCreator.cpp" />
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCL\OpenCLWrapper.cpp" />
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCL\RendererCL.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCL\EmberCLFunctions.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCL\EmberCLStructs.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCL\DEOpenCLKernelCreator.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCL\FinalAccumOpenCLKernelCreator.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCL\IterOpenCLKernelCreator.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCL\OpenCLWrapper.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCL\RendererCL.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCL\EmberCLPch.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
69
Builds/MSVC/VS2010/EmberCL.vcxproj.filters
Normal file
69
Builds/MSVC/VS2010/EmberCL.vcxproj.filters
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Resource Files">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Kernel Creators">
|
||||||
|
<UniqueIdentifier>{d66f35ca-a4cd-470a-9c56-653b0665b598}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="ReadMe.txt" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCL\DllMain.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCL\OpenCLWrapper.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCL\RendererCL.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCL\DEOpenCLKernelCreator.cpp">
|
||||||
|
<Filter>Kernel Creators</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCL\FinalAccumOpenCLKernelCreator.cpp">
|
||||||
|
<Filter>Kernel Creators</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCL\IterOpenCLKernelCreator.cpp">
|
||||||
|
<Filter>Kernel Creators</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCL\OpenCLWrapper.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCL\RendererCL.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCL\EmberCLStructs.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCL\EmberCLPch.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCL\EmberCLFunctions.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCL\DEOpenCLKernelCreator.h">
|
||||||
|
<Filter>Kernel Creators</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCL\FinalAccumOpenCLKernelCreator.h">
|
||||||
|
<Filter>Kernel Creators</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCL\IterOpenCLKernelCreator.h">
|
||||||
|
<Filter>Kernel Creators</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
329
Builds/MSVC/VS2010/EmberGenome.vcxproj
Normal file
329
Builds/MSVC/VS2010/EmberGenome.vcxproj
Normal file
@ -0,0 +1,329 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="ReleaseNvidia|Win32">
|
||||||
|
<Configuration>ReleaseNvidia</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="ReleaseNvidia|x64">
|
||||||
|
<Configuration>ReleaseNvidia</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}</ProjectGuid>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<RootNamespace>EmberGenome</RootNamespace>
|
||||||
|
<ProjectName>EmberGenome</ProjectName>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb_debug.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb_debug.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb_debug.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb_debug.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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;$(CUDA_PATH)include</AdditionalIncludeDirectories>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\..\..\Source\Fractorium\Icons\Fractorium.ico" />
|
||||||
|
<None Include="ReadMe.txt" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\..\..\libxml2\win32\VC10\libxml2.vcxproj">
|
||||||
|
<Project>{1d6039f6-5078-416f-a3af-a36efc7e6a1c}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\..\..\tbb\build\vs2010\tbb.vcxproj">
|
||||||
|
<Project>{f62787dd-1327-448b-9818-030062bcfaa5}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="Ember.vcxproj">
|
||||||
|
<Project>{2bdb7a54-bb1a-476b-a6e5-f81e90ad4e67}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="EmberCL.vcxproj">
|
||||||
|
<Project>{f6a9102c-69a9-48fb-bc4b-49e49af43236}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberCommon.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberCommonPch.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberOptions.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\JpegUtils.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\SimpleGlob.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\SimpleOpt.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberGenome\EmberGenome.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberGenome\resource.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCommon\EmberCommonPch.cpp">
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Create</PrecompiledHeader>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberGenome\EmberGenome.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ResourceCompile Include="..\..\..\Source\EmberGenome\EmberGenome.rc" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
62
Builds/MSVC/VS2010/EmberGenome.vcxproj.filters
Normal file
62
Builds/MSVC/VS2010/EmberGenome.vcxproj.filters
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Resource Files">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="ReadMe.txt" />
|
||||||
|
<None Include="..\..\..\Source\Fractorium\Icons\Fractorium.ico">
|
||||||
|
<Filter>Resource Files</Filter>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberCommonPch.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\JpegUtils.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\SimpleGlob.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\SimpleOpt.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberCommon.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberOptions.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberGenome\EmberGenome.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberGenome\resource.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCommon\EmberCommonPch.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberGenome\EmberGenome.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ResourceCompile Include="..\..\..\Source\EmberGenome\EmberGenome.rc">
|
||||||
|
<Filter>Resource Files</Filter>
|
||||||
|
</ResourceCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
337
Builds/MSVC/VS2010/EmberRender.vcxproj
Normal file
337
Builds/MSVC/VS2010/EmberRender.vcxproj
Normal file
@ -0,0 +1,337 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="ReleaseNvidia|Win32">
|
||||||
|
<Configuration>ReleaseNvidia</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="ReleaseNvidia|x64">
|
||||||
|
<Configuration>ReleaseNvidia</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}</ProjectGuid>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<RootNamespace>EmberRender</RootNamespace>
|
||||||
|
<ProjectName>EmberRender</ProjectName>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb_debug.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb_debug.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb_debug.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb_debug.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
<FloatingPointModel>Precise</FloatingPointModel>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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;$(CUDA_PATH)include</AdditionalIncludeDirectories>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
<FloatingPointModel>Precise</FloatingPointModel>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\..\..\Source\Fractorium\Icons\Fractorium.ico" />
|
||||||
|
<None Include="ReadMe.txt" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\..\..\libjpeg\jpeg.vcxproj">
|
||||||
|
<Project>{019dbd2a-273d-4ba4-bf86-b5efe2ed76b1}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\..\..\libpng\projects\vstudio\libpng\libpng.vcxproj">
|
||||||
|
<Project>{d6973076-9317-4ef2-a0b8-b7a18ac0713e}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\..\..\libxml2\win32\VC10\libxml2.vcxproj">
|
||||||
|
<Project>{1d6039f6-5078-416f-a3af-a36efc7e6a1c}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\..\..\tbb\build\vs2010\tbb.vcxproj">
|
||||||
|
<Project>{f62787dd-1327-448b-9818-030062bcfaa5}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="Ember.vcxproj">
|
||||||
|
<Project>{2bdb7a54-bb1a-476b-a6e5-f81e90ad4e67}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="EmberCL.vcxproj">
|
||||||
|
<Project>{f6a9102c-69a9-48fb-bc4b-49e49af43236}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberCommon.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberCommonPch.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberOptions.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\JpegUtils.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\SimpleGlob.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\SimpleOpt.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberRender\EmberRender.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberRender\resource.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCommon\EmberCommonPch.cpp">
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Create</PrecompiledHeader>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberRender\EmberRender.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ResourceCompile Include="..\..\..\Source\EmberRender\EmberRender.rc" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
62
Builds/MSVC/VS2010/EmberRender.vcxproj.filters
Normal file
62
Builds/MSVC/VS2010/EmberRender.vcxproj.filters
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Resource Files">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="ReadMe.txt" />
|
||||||
|
<None Include="..\..\..\Source\Fractorium\Icons\Fractorium.ico">
|
||||||
|
<Filter>Resource Files</Filter>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberCommonPch.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\JpegUtils.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\SimpleGlob.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\SimpleOpt.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberCommon.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberOptions.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberRender\EmberRender.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberRender\resource.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCommon\EmberCommonPch.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberRender\EmberRender.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ResourceCompile Include="..\..\..\Source\EmberRender\EmberRender.rc">
|
||||||
|
<Filter>Resource Files</Filter>
|
||||||
|
</ResourceCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
324
Builds/MSVC/VS2010/EmberTester.vcxproj
Normal file
324
Builds/MSVC/VS2010/EmberTester.vcxproj
Normal file
@ -0,0 +1,324 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="ReleaseNvidia|Win32">
|
||||||
|
<Configuration>ReleaseNvidia</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="ReleaseNvidia|x64">
|
||||||
|
<Configuration>ReleaseNvidia</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{320F611A-F9CE-4196-A8DC-FA24B2E8A320}</ProjectGuid>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<RootNamespace>EmberTester</RootNamespace>
|
||||||
|
<ProjectName>EmberTester</ProjectName>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb_debug.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb_debug.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb_debug.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb_debug.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(ProjectDir)..\..\..\..\tbb\build\vsproject\ia32\$(Configuration)\tbb.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<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;$(CUDA_PATH)include</AdditionalIncludeDirectories>
|
||||||
|
<DisableSpecificWarnings>4251</DisableSpecificWarnings>
|
||||||
|
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb.dll" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)intel64\$(Configuration)\tbb.pdb" "$(OutDir)"
|
||||||
|
xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="ReadMe.txt" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\..\..\libxml2\win32\VC10\libxml2.vcxproj">
|
||||||
|
<Project>{1d6039f6-5078-416f-a3af-a36efc7e6a1c}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\..\..\tbb\build\vs2010\tbb.vcxproj">
|
||||||
|
<Project>{f62787dd-1327-448b-9818-030062bcfaa5}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="Ember.vcxproj">
|
||||||
|
<Project>{2bdb7a54-bb1a-476b-a6e5-f81e90ad4e67}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="EmberCL.vcxproj">
|
||||||
|
<Project>{f6a9102c-69a9-48fb-bc4b-49e49af43236}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberCommon.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberCommonPch.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberOptions.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\JpegUtils.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\SimpleGlob.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\SimpleOpt.h" />
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberTester\EmberTester.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCommon\EmberCommonPch.cpp">
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Create</PrecompiledHeader>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberTester\EmberTester.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
51
Builds/MSVC/VS2010/EmberTester.vcxproj.filters
Normal file
51
Builds/MSVC/VS2010/EmberTester.vcxproj.filters
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Resource Files">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="ReadMe.txt" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberCommon.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberCommonPch.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberOptions.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\JpegUtils.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\SimpleGlob.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\SimpleOpt.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberTester\EmberTester.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberTester\EmberTester.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\EmberCommon\EmberCommonPch.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
981
Builds/MSVC/VS2010/Fractorium.sln
Normal file
981
Builds/MSVC/VS2010/Fractorium.sln
Normal file
@ -0,0 +1,981 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||||
|
# Visual Studio 2010
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ember", "Ember.vcxproj", "{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EmberTester", "EmberTester.vcxproj", "{320F611A-F9CE-4196-A8DC-FA24B2E8A320}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF} = {60F89955-91C6-3A36-8000-13C592FEC2DF}
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35} = {EB33566E-DA7F-4D28-9077-88C0B7C77E35}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Fractorium", "Fractorium.vcxproj", "{6547D5FA-64CE-44BA-9D3C-B6E217456445}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EmberRender", "EmberRender.vcxproj", "{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35} = {EB33566E-DA7F-4D28-9077-88C0B7C77E35}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EmberAnimate", "EmberAnimate.vcxproj", "{35285FCF-6FA8-410E-841B-70AE744D38B8}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35} = {EB33566E-DA7F-4D28-9077-88C0B7C77E35}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EmberGenome", "EmberGenome.vcxproj", "{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35} = {EB33566E-DA7F-4D28-9077-88C0B7C77E35}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EmberCL", "EmberCL.vcxproj", "{F6A9102C-69A9-48FB-BC4B-49E49AF43236}"
|
||||||
|
EndProject
|
||||||
|
Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "FractoriumInstaller", "FractoriumInstaller\FractoriumInstaller.wixproj", "{C8096C47-E358-438C-A520-146D46B0637D}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1} = {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236} = {F6A9102C-69A9-48FB-BC4B-49E49AF43236}
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29} = {4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67} = {2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF} = {60F89955-91C6-3A36-8000-13C592FEC2DF}
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35} = {EB33566E-DA7F-4D28-9077-88C0B7C77E35}
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E} = {D6973076-9317-4EF2-A0B8-B7A18AC0713E}
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7} = {7930CAAC-9FC4-4202-B6A3-E760F73F88B7}
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8} = {35285FCF-6FA8-410E-841B-70AE744D38B8}
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5} = {F62787DD-1327-448B-9818-030062BCFAA5}
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C} = {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445} = {6547D5FA-64CE-44BA-9D3C-B6E217456445}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tbb", "..\..\..\..\tbb\build\vs2010\tbb.vcxproj", "{F62787DD-1327-448B-9818-030062BCFAA5}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "..\..\..\..\libpng\projects\vstudio\zlib\zlib.vcxproj", "{60F89955-91C6-3A36-8000-13C592FEC2DF}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pnglibconf", "..\..\..\..\libpng\projects\vstudio\pnglibconf\pnglibconf.vcxproj", "{EB33566E-DA7F-4D28-9077-88C0B7C77E35}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "..\..\..\..\libpng\projects\vstudio\libpng\libpng.vcxproj", "{D6973076-9317-4EF2-A0B8-B7A18AC0713E}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35} = {EB33566E-DA7F-4D28-9077-88C0B7C77E35}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpeg", "..\..\..\..\libjpeg\jpeg.vcxproj", "{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libxml2", "..\..\..\..\libxml2\win32\VC10\libxml2.vcxproj", "{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF} = {60F89955-91C6-3A36-8000-13C592FEC2DF}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug Library|Mixed Platforms = Debug Library|Mixed Platforms
|
||||||
|
Debug Library|Win32 = Debug Library|Win32
|
||||||
|
Debug Library|x64 = Debug Library|x64
|
||||||
|
Debug Library|x86 = Debug Library|x86
|
||||||
|
Debug MX|Mixed Platforms = Debug MX|Mixed Platforms
|
||||||
|
Debug MX|Win32 = Debug MX|Win32
|
||||||
|
Debug MX|x64 = Debug MX|x64
|
||||||
|
Debug MX|x86 = Debug MX|x86
|
||||||
|
Debug|Mixed Platforms = Debug|Mixed Platforms
|
||||||
|
Debug|Win32 = Debug|Win32
|
||||||
|
Debug|x64 = Debug|x64
|
||||||
|
Debug|x86 = Debug|x86
|
||||||
|
Debug-MT|Mixed Platforms = Debug-MT|Mixed Platforms
|
||||||
|
Debug-MT|Win32 = Debug-MT|Win32
|
||||||
|
Debug-MT|x64 = Debug-MT|x64
|
||||||
|
Debug-MT|x86 = Debug-MT|x86
|
||||||
|
Release Library|Mixed Platforms = Release Library|Mixed Platforms
|
||||||
|
Release Library|Win32 = Release Library|Win32
|
||||||
|
Release Library|x64 = Release Library|x64
|
||||||
|
Release Library|x86 = Release Library|x86
|
||||||
|
Release MX|Mixed Platforms = Release MX|Mixed Platforms
|
||||||
|
Release MX|Win32 = Release MX|Win32
|
||||||
|
Release MX|x64 = Release MX|x64
|
||||||
|
Release MX|x86 = Release MX|x86
|
||||||
|
Release|Mixed Platforms = Release|Mixed Platforms
|
||||||
|
Release|Win32 = Release|Win32
|
||||||
|
Release|x64 = Release|x64
|
||||||
|
Release|x86 = Release|x86
|
||||||
|
Release-MT|Mixed Platforms = Release-MT|Mixed Platforms
|
||||||
|
Release-MT|Win32 = Release-MT|Win32
|
||||||
|
Release-MT|x64 = Release-MT|x64
|
||||||
|
Release-MT|x86 = Release-MT|x86
|
||||||
|
ReleaseNvidia|Mixed Platforms = ReleaseNvidia|Mixed Platforms
|
||||||
|
ReleaseNvidia|Win32 = ReleaseNvidia|Win32
|
||||||
|
ReleaseNvidia|x64 = ReleaseNvidia|x64
|
||||||
|
ReleaseNvidia|x86 = ReleaseNvidia|x86
|
||||||
|
ReleaseWithoutAsm|Mixed Platforms = ReleaseWithoutAsm|Mixed Platforms
|
||||||
|
ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32
|
||||||
|
ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64
|
||||||
|
ReleaseWithoutAsm|x86 = ReleaseWithoutAsm|x86
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug Library|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug Library|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug Library|Win32.ActiveCfg = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug Library|x64.ActiveCfg = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug Library|x64.Build.0 = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug Library|x86.ActiveCfg = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug MX|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug MX|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug MX|Win32.ActiveCfg = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug MX|x64.ActiveCfg = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug MX|x64.Build.0 = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug MX|x86.ActiveCfg = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug|x86.ActiveCfg = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug-MT|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug-MT|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug-MT|Win32.ActiveCfg = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug-MT|x64.ActiveCfg = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug-MT|x64.Build.0 = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Debug-MT|x86.ActiveCfg = Debug|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release Library|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release Library|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release Library|Win32.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release Library|x64.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release Library|x64.Build.0 = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release Library|x86.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release MX|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release MX|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release MX|Win32.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release MX|x64.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release MX|x64.Build.0 = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release MX|x86.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release|x64.Build.0 = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release|x86.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release-MT|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release-MT|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release-MT|Win32.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|x86.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseNvidia|Win32.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseNvidia|x64.ActiveCfg = ReleaseNvidia|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseNvidia|x64.Build.0 = ReleaseNvidia|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseNvidia|x86.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseWithoutAsm|x64.Build.0 = Release|x64
|
||||||
|
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseWithoutAsm|x86.ActiveCfg = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug Library|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug Library|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug Library|Win32.ActiveCfg = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug Library|x64.ActiveCfg = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug Library|x64.Build.0 = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug Library|x86.ActiveCfg = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug MX|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug MX|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug MX|Win32.ActiveCfg = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug MX|x64.ActiveCfg = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug MX|x64.Build.0 = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug MX|x86.ActiveCfg = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug|x86.ActiveCfg = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug-MT|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug-MT|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug-MT|Win32.ActiveCfg = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug-MT|x64.ActiveCfg = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug-MT|x64.Build.0 = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Debug-MT|x86.ActiveCfg = Debug|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release Library|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release Library|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release Library|Win32.ActiveCfg = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release Library|x64.ActiveCfg = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release Library|x64.Build.0 = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release Library|x86.ActiveCfg = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release MX|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release MX|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release MX|Win32.ActiveCfg = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release MX|x64.ActiveCfg = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release MX|x64.Build.0 = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release MX|x86.ActiveCfg = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release|x86.ActiveCfg = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release-MT|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release-MT|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release-MT|Win32.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|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|x86.ActiveCfg = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.ReleaseWithoutAsm|x64.Build.0 = Release|x64
|
||||||
|
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.ReleaseWithoutAsm|x86.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug Library|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug Library|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug Library|Win32.ActiveCfg = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug Library|x64.ActiveCfg = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug Library|x64.Build.0 = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug Library|x86.ActiveCfg = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug MX|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug MX|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug MX|Win32.ActiveCfg = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug MX|x64.ActiveCfg = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug MX|x64.Build.0 = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug MX|x86.ActiveCfg = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug|x86.ActiveCfg = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug-MT|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug-MT|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug-MT|Win32.ActiveCfg = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug-MT|x64.ActiveCfg = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug-MT|x64.Build.0 = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Debug-MT|x86.ActiveCfg = Debug|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release Library|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release Library|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release Library|Win32.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release Library|x64.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release Library|x64.Build.0 = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release Library|x86.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release MX|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release MX|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release MX|Win32.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release MX|x64.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release MX|x64.Build.0 = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release MX|x86.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release|x64.Build.0 = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release|x86.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release-MT|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release-MT|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release-MT|Win32.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|x86.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseNvidia|Win32.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseNvidia|x64.ActiveCfg = ReleaseNvidia|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseNvidia|x64.Build.0 = ReleaseNvidia|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseNvidia|x86.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseWithoutAsm|x64.Build.0 = Release|x64
|
||||||
|
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseWithoutAsm|x86.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug Library|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug Library|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug Library|Win32.ActiveCfg = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug Library|x64.ActiveCfg = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug Library|x64.Build.0 = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug Library|x86.ActiveCfg = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug MX|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug MX|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug MX|Win32.ActiveCfg = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug MX|x64.ActiveCfg = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug MX|x64.Build.0 = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug MX|x86.ActiveCfg = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug|x86.ActiveCfg = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug-MT|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug-MT|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug-MT|Win32.ActiveCfg = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug-MT|x64.ActiveCfg = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug-MT|x64.Build.0 = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Debug-MT|x86.ActiveCfg = Debug|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release Library|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release Library|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release Library|Win32.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release Library|x64.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release Library|x64.Build.0 = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release Library|x86.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release MX|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release MX|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release MX|Win32.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release MX|x64.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release MX|x64.Build.0 = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release MX|x86.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release|x64.Build.0 = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release|x86.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release-MT|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release-MT|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release-MT|Win32.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|x86.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseNvidia|Win32.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseNvidia|x64.ActiveCfg = ReleaseNvidia|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseNvidia|x64.Build.0 = ReleaseNvidia|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseNvidia|x86.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseWithoutAsm|x64.Build.0 = Release|x64
|
||||||
|
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseWithoutAsm|x86.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug Library|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug Library|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug Library|Win32.ActiveCfg = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug Library|x64.ActiveCfg = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug Library|x64.Build.0 = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug Library|x86.ActiveCfg = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug MX|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug MX|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug MX|Win32.ActiveCfg = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug MX|x64.ActiveCfg = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug MX|x64.Build.0 = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug MX|x86.ActiveCfg = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug|x86.ActiveCfg = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug-MT|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug-MT|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug-MT|Win32.ActiveCfg = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug-MT|x64.ActiveCfg = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug-MT|x64.Build.0 = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Debug-MT|x86.ActiveCfg = Debug|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release Library|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release Library|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release Library|Win32.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release Library|x64.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release Library|x64.Build.0 = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release Library|x86.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release MX|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release MX|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release MX|Win32.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release MX|x64.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release MX|x64.Build.0 = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release MX|x86.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release|x64.Build.0 = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release|x86.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release-MT|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release-MT|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release-MT|Win32.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|x86.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseNvidia|Win32.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseNvidia|x64.ActiveCfg = ReleaseNvidia|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseNvidia|x64.Build.0 = ReleaseNvidia|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseNvidia|x86.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseWithoutAsm|x64.Build.0 = Release|x64
|
||||||
|
{35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseWithoutAsm|x86.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug Library|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug Library|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug Library|Win32.ActiveCfg = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug Library|x64.ActiveCfg = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug Library|x64.Build.0 = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug Library|x86.ActiveCfg = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug MX|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug MX|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug MX|Win32.ActiveCfg = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug MX|x64.ActiveCfg = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug MX|x64.Build.0 = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug MX|x86.ActiveCfg = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug|x86.ActiveCfg = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug-MT|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug-MT|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug-MT|Win32.ActiveCfg = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug-MT|x64.ActiveCfg = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug-MT|x64.Build.0 = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Debug-MT|x86.ActiveCfg = Debug|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release Library|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release Library|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release Library|Win32.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release Library|x64.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release Library|x64.Build.0 = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release Library|x86.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release MX|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release MX|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release MX|Win32.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release MX|x64.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release MX|x64.Build.0 = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release MX|x86.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release|x64.Build.0 = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release|x86.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release-MT|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release-MT|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release-MT|Win32.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|x86.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseNvidia|Win32.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseNvidia|x64.ActiveCfg = ReleaseNvidia|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseNvidia|x64.Build.0 = ReleaseNvidia|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseNvidia|x86.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseWithoutAsm|x64.Build.0 = Release|x64
|
||||||
|
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseWithoutAsm|x86.ActiveCfg = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug Library|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug Library|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug Library|Win32.ActiveCfg = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug Library|x64.ActiveCfg = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug Library|x64.Build.0 = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug Library|x86.ActiveCfg = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug MX|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug MX|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug MX|Win32.ActiveCfg = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug MX|x64.ActiveCfg = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug MX|x64.Build.0 = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug MX|x86.ActiveCfg = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug|x86.ActiveCfg = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug-MT|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug-MT|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug-MT|Win32.ActiveCfg = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug-MT|x64.ActiveCfg = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug-MT|x64.Build.0 = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Debug-MT|x86.ActiveCfg = Debug|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release Library|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release Library|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release Library|Win32.ActiveCfg = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release Library|x64.ActiveCfg = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release Library|x64.Build.0 = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release Library|x86.ActiveCfg = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release MX|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release MX|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release MX|Win32.ActiveCfg = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release MX|x64.ActiveCfg = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release MX|x64.Build.0 = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release MX|x86.ActiveCfg = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release|x64.Build.0 = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release|x86.ActiveCfg = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release-MT|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release-MT|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release-MT|Win32.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|x86.ActiveCfg = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseNvidia|Mixed Platforms.ActiveCfg = ReleaseNvidia|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseNvidia|Mixed Platforms.Build.0 = ReleaseNvidia|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseNvidia|Win32.ActiveCfg = ReleaseNvidia|Win32
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseNvidia|Win32.Build.0 = ReleaseNvidia|Win32
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseNvidia|x64.ActiveCfg = ReleaseNvidia|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseNvidia|x64.Build.0 = ReleaseNvidia|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseNvidia|x86.ActiveCfg = ReleaseNvidia|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseWithoutAsm|x64.Build.0 = Release|x64
|
||||||
|
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseWithoutAsm|x86.ActiveCfg = Release|x64
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug Library|Mixed Platforms.ActiveCfg = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug Library|Mixed Platforms.Build.0 = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug Library|Win32.ActiveCfg = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug Library|x64.ActiveCfg = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug Library|x86.ActiveCfg = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug Library|x86.Build.0 = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug MX|Mixed Platforms.ActiveCfg = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug MX|Mixed Platforms.Build.0 = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug MX|Win32.ActiveCfg = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug MX|x64.ActiveCfg = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug MX|x86.ActiveCfg = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug MX|x86.Build.0 = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug|Mixed Platforms.Build.0 = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug|Win32.ActiveCfg = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug|x86.Build.0 = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug-MT|Mixed Platforms.ActiveCfg = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug-MT|Mixed Platforms.Build.0 = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug-MT|Win32.ActiveCfg = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug-MT|x64.ActiveCfg = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug-MT|x86.ActiveCfg = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Debug-MT|x86.Build.0 = Debug|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release Library|Mixed Platforms.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release Library|Mixed Platforms.Build.0 = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release Library|Win32.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release Library|x64.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release Library|x86.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release Library|x86.Build.0 = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release MX|Mixed Platforms.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release MX|Mixed Platforms.Build.0 = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release MX|Win32.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release MX|x64.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release MX|x86.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release MX|x86.Build.0 = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release|Mixed Platforms.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release|Mixed Platforms.Build.0 = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release|Win32.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release|x64.Build.0 = Release|x64
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release|x86.Build.0 = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release-MT|Mixed Platforms.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release-MT|Mixed Platforms.Build.0 = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release-MT|Win32.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release-MT|x64.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release-MT|x86.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.Release-MT|x86.Build.0 = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.ReleaseNvidia|Win32.ActiveCfg = Release|x64
|
||||||
|
{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 = Release|x64
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.ReleaseWithoutAsm|x86.ActiveCfg = Release|x86
|
||||||
|
{C8096C47-E358-438C-A520-146D46B0637D}.ReleaseWithoutAsm|x86.Build.0 = Release|x86
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug Library|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug Library|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug Library|Win32.ActiveCfg = Debug|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug Library|x64.ActiveCfg = Debug|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug Library|x64.Build.0 = Debug|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug Library|x86.ActiveCfg = Debug|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug MX|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug MX|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug MX|Win32.ActiveCfg = Debug|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug MX|x64.ActiveCfg = Debug|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug MX|x64.Build.0 = Debug|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug MX|x86.ActiveCfg = Debug|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug|Mixed Platforms.Build.0 = Debug|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug|x86.ActiveCfg = Debug|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug-MT|Mixed Platforms.ActiveCfg = Debug-MT|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug-MT|Mixed Platforms.Build.0 = Debug-MT|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug-MT|Win32.ActiveCfg = Debug-MT|Win32
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug-MT|Win32.Build.0 = Debug-MT|Win32
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug-MT|x64.ActiveCfg = Debug-MT|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug-MT|x64.Build.0 = Debug-MT|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Debug-MT|x86.ActiveCfg = Debug-MT|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release Library|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release Library|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release Library|Win32.ActiveCfg = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release Library|x64.ActiveCfg = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release Library|x64.Build.0 = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release Library|x86.ActiveCfg = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release MX|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release MX|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release MX|Win32.ActiveCfg = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release MX|x64.ActiveCfg = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release MX|x64.Build.0 = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release MX|x86.ActiveCfg = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release|x64.Build.0 = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release|x86.ActiveCfg = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release-MT|Mixed Platforms.ActiveCfg = Release-MT|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release-MT|Mixed Platforms.Build.0 = Release-MT|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release-MT|Win32.ActiveCfg = Release-MT|Win32
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release-MT|Win32.Build.0 = Release-MT|Win32
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release-MT|x64.ActiveCfg = Release-MT|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release-MT|x64.Build.0 = Release-MT|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.Release-MT|x86.ActiveCfg = Release-MT|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseNvidia|Win32.ActiveCfg = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseNvidia|x64.ActiveCfg = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseNvidia|x64.Build.0 = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseNvidia|x86.ActiveCfg = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseWithoutAsm|x64.Build.0 = Release|x64
|
||||||
|
{F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseWithoutAsm|x86.ActiveCfg = Release|x64
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug Library|Mixed Platforms.ActiveCfg = Debug Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug Library|Mixed Platforms.Build.0 = Debug Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug Library|Win32.ActiveCfg = Debug Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug Library|Win32.Build.0 = Debug Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug Library|x64.ActiveCfg = Debug Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug Library|x86.ActiveCfg = Debug Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug MX|Mixed Platforms.ActiveCfg = Debug Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug MX|Mixed Platforms.Build.0 = Debug Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug MX|Win32.ActiveCfg = Debug Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug MX|Win32.Build.0 = Debug Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug MX|x64.ActiveCfg = Debug Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug MX|x86.ActiveCfg = Debug Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug|Mixed Platforms.Build.0 = Debug|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug-MT|Mixed Platforms.ActiveCfg = Debug|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug-MT|Mixed Platforms.Build.0 = Debug|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug-MT|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug-MT|Win32.Build.0 = Debug|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug-MT|x64.ActiveCfg = Debug|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Debug-MT|x86.ActiveCfg = Debug|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release Library|Mixed Platforms.ActiveCfg = Release Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release Library|Mixed Platforms.Build.0 = Release Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release Library|Win32.ActiveCfg = Release Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release Library|Win32.Build.0 = Release Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release Library|x64.ActiveCfg = Release Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release Library|x86.ActiveCfg = Release Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release MX|Mixed Platforms.ActiveCfg = Release Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release MX|Mixed Platforms.Build.0 = Release Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release MX|Win32.ActiveCfg = Release Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release MX|Win32.Build.0 = Release Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release MX|x64.ActiveCfg = Release Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release MX|x86.ActiveCfg = Release Library|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release|x64.Build.0 = Release|x64
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release-MT|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release-MT|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release-MT|Win32.ActiveCfg = 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|x86.ActiveCfg = Release|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseNvidia|Win32.ActiveCfg = Release|x64
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseNvidia|x64.ActiveCfg = Release|x64
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseNvidia|x64.Build.0 = Release|x64
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseNvidia|x86.ActiveCfg = Release|x64
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseWithoutAsm|Win32.Build.0 = Release|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseWithoutAsm|x64.ActiveCfg = Release|Win32
|
||||||
|
{60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseWithoutAsm|x86.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug Library|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug Library|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug Library|Win32.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug Library|Win32.Build.0 = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug Library|x64.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug Library|x86.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug MX|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug MX|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug MX|Win32.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug MX|Win32.Build.0 = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug MX|x64.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug MX|x86.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug|Win32.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug|Win32.Build.0 = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug|x64.ActiveCfg = Release|x64
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug|x64.Build.0 = Release|x64
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug|x86.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug-MT|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug-MT|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug-MT|Win32.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug-MT|Win32.Build.0 = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug-MT|x64.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Debug-MT|x86.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release Library|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release Library|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release Library|Win32.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release Library|Win32.Build.0 = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release Library|x64.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release Library|x86.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release MX|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release MX|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release MX|Win32.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release MX|Win32.Build.0 = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release MX|x64.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release MX|x86.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release|x64.Build.0 = Release|x64
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release-MT|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release-MT|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release-MT|Win32.ActiveCfg = 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|x86.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseNvidia|Win32.ActiveCfg = Release|x64
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseNvidia|x64.ActiveCfg = Release|x64
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseNvidia|x64.Build.0 = Release|x64
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseNvidia|x86.ActiveCfg = Release|x64
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseWithoutAsm|Win32.Build.0 = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseWithoutAsm|x64.ActiveCfg = Release|Win32
|
||||||
|
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseWithoutAsm|x86.ActiveCfg = Release|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug Library|Mixed Platforms.ActiveCfg = Debug Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug Library|Mixed Platforms.Build.0 = Debug Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug Library|Win32.ActiveCfg = Debug Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug Library|Win32.Build.0 = Debug Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug Library|x64.ActiveCfg = Debug Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug Library|x86.ActiveCfg = Debug Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug MX|Mixed Platforms.ActiveCfg = Debug Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug MX|Mixed Platforms.Build.0 = Debug Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug MX|Win32.ActiveCfg = Debug Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug MX|Win32.Build.0 = Debug Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug MX|x64.ActiveCfg = Debug Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug MX|x86.ActiveCfg = Debug Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|Mixed Platforms.Build.0 = Debug|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug-MT|Mixed Platforms.ActiveCfg = Debug|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug-MT|Mixed Platforms.Build.0 = Debug|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug-MT|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug-MT|Win32.Build.0 = Debug|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug-MT|x64.ActiveCfg = Debug|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug-MT|x86.ActiveCfg = Debug|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release Library|Mixed Platforms.ActiveCfg = Release Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release Library|Mixed Platforms.Build.0 = Release Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release Library|Win32.ActiveCfg = Release Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release Library|Win32.Build.0 = Release Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release Library|x64.ActiveCfg = Release Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release Library|x86.ActiveCfg = Release Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release MX|Mixed Platforms.ActiveCfg = Release Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release MX|Mixed Platforms.Build.0 = Release Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release MX|Win32.ActiveCfg = Release Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release MX|Win32.Build.0 = Release Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release MX|x64.ActiveCfg = Release Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release MX|x86.ActiveCfg = Release Library|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|x64.Build.0 = Release|x64
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release-MT|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release-MT|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release-MT|Win32.ActiveCfg = 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|x86.ActiveCfg = Release|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseNvidia|Win32.ActiveCfg = Release|x64
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseNvidia|x64.ActiveCfg = Release|x64
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseNvidia|x64.Build.0 = Release|x64
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseNvidia|x86.ActiveCfg = Release|x64
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseWithoutAsm|Win32.Build.0 = Release|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseWithoutAsm|x64.ActiveCfg = Release|Win32
|
||||||
|
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseWithoutAsm|x86.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug Library|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug Library|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug Library|Win32.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug Library|Win32.Build.0 = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug Library|x64.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug Library|x86.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug MX|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug MX|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug MX|Win32.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug MX|Win32.Build.0 = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug MX|x64.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug MX|x86.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|Win32.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|Win32.Build.0 = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|x64.ActiveCfg = Release|x64
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|x64.Build.0 = Release|x64
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|x86.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug-MT|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug-MT|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug-MT|Win32.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug-MT|Win32.Build.0 = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug-MT|x64.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug-MT|x86.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release Library|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release Library|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release Library|Win32.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release Library|Win32.Build.0 = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release Library|x64.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release Library|x86.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release MX|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release MX|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release MX|Win32.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release MX|Win32.Build.0 = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release MX|x64.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release MX|x86.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|x64.Build.0 = Release|x64
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release-MT|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release-MT|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release-MT|Win32.ActiveCfg = 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|x86.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseNvidia|Win32.ActiveCfg = Release|x64
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseNvidia|x64.ActiveCfg = Release|x64
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseNvidia|x64.Build.0 = Release|x64
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseNvidia|x86.ActiveCfg = Release|x64
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseWithoutAsm|Win32.Build.0 = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseWithoutAsm|x64.ActiveCfg = Release|Win32
|
||||||
|
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseWithoutAsm|x86.ActiveCfg = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug Library|Mixed Platforms.ActiveCfg = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug Library|Mixed Platforms.Build.0 = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug Library|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug Library|Win32.Build.0 = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug Library|x64.ActiveCfg = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug Library|x86.ActiveCfg = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug MX|Mixed Platforms.ActiveCfg = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug MX|Mixed Platforms.Build.0 = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug MX|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug MX|Win32.Build.0 = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug MX|x64.ActiveCfg = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug MX|x86.ActiveCfg = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug|Mixed Platforms.Build.0 = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug-MT|Mixed Platforms.ActiveCfg = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug-MT|Mixed Platforms.Build.0 = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug-MT|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug-MT|Win32.Build.0 = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug-MT|x64.ActiveCfg = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug-MT|x86.ActiveCfg = Debug|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release Library|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release Library|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release Library|Win32.ActiveCfg = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release Library|Win32.Build.0 = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release Library|x64.ActiveCfg = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release Library|x86.ActiveCfg = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release MX|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release MX|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release MX|Win32.ActiveCfg = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release MX|Win32.Build.0 = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release MX|x64.ActiveCfg = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release MX|x86.ActiveCfg = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release|x64.Build.0 = Release|x64
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release-MT|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release-MT|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release-MT|Win32.ActiveCfg = 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|x86.ActiveCfg = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseNvidia|Win32.ActiveCfg = Release|x64
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseNvidia|x64.ActiveCfg = Release|x64
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseNvidia|x64.Build.0 = Release|x64
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseNvidia|x86.ActiveCfg = Release|x64
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseWithoutAsm|Win32.Build.0 = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseWithoutAsm|x64.ActiveCfg = Release|Win32
|
||||||
|
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseWithoutAsm|x86.ActiveCfg = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
1109
Builds/MSVC/VS2010/Fractorium.vcxproj
Normal file
1109
Builds/MSVC/VS2010/Fractorium.vcxproj
Normal file
File diff suppressed because it is too large
Load Diff
338
Builds/MSVC/VS2010/Fractorium.vcxproj.filters
Normal file
338
Builds/MSVC/VS2010/Fractorium.vcxproj.filters
Normal file
@ -0,0 +1,338 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;cxx;c;def</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Form Files">
|
||||||
|
<UniqueIdentifier>{99349809-55BA-4b9d-BF79-8FDBB0286EB3}</UniqueIdentifier>
|
||||||
|
<Extensions>ui</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Resource Files">
|
||||||
|
<UniqueIdentifier>{D9D6E242-F8AF-46E4-B9FD-80ECBC20BA3E}</UniqueIdentifier>
|
||||||
|
<Extensions>qrc;*</Extensions>
|
||||||
|
<ParseFiles>false</ParseFiles>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Generated Files">
|
||||||
|
<UniqueIdentifier>{71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11}</UniqueIdentifier>
|
||||||
|
<Extensions>moc;h;cpp</Extensions>
|
||||||
|
<SourceControlFiles>False</SourceControlFiles>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Generated Files\Debug">
|
||||||
|
<UniqueIdentifier>{44a6e761-1e1f-46ce-820d-b80d1c0265ae}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;moc</Extensions>
|
||||||
|
<SourceControlFiles>False</SourceControlFiles>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Generated Files\Release">
|
||||||
|
<UniqueIdentifier>{cc25f297-1a73-4c08-9b5f-8dad7c7c7452}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;moc</Extensions>
|
||||||
|
<SourceControlFiles>False</SourceControlFiles>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Glm">
|
||||||
|
<UniqueIdentifier>{d61ea4d8-e7a6-4d86-934e-992611e1c181}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Widgets">
|
||||||
|
<UniqueIdentifier>{84e24710-0e4f-4aa3-9f74-82cd2a3b39a7}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Dialogs">
|
||||||
|
<UniqueIdentifier>{5555e39d-b8d2-4bac-bf6c-6763228b15bc}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="MainWindows">
|
||||||
|
<UniqueIdentifier>{26fa32d9-268c-4021-8398-d40d46344dff}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Controllers">
|
||||||
|
<UniqueIdentifier>{811962f9-51c1-48ba-a9da-f5ce981aea71}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Generated Files\ReleaseNvidia">
|
||||||
|
<UniqueIdentifier>{52886ad8-fa57-4c60-b799-7c648147b7f1}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;moc</Extensions>
|
||||||
|
<SourceControlFiles>False</SourceControlFiles>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\main.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\qrc_Fractorium.cpp">
|
||||||
|
<Filter>Generated Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\FractoriumPch.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\DoubleSpinBox.cpp">
|
||||||
|
<Filter>Widgets</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\SpinBox.cpp">
|
||||||
|
<Filter>Widgets</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\AboutDialog.cpp">
|
||||||
|
<Filter>Dialogs</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\FinalRenderDialog.cpp">
|
||||||
|
<Filter>Dialogs</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\OptionsDialog.cpp">
|
||||||
|
<Filter>Dialogs</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\Fractorium.cpp">
|
||||||
|
<Filter>MainWindows</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\GLWidget.cpp">
|
||||||
|
<Filter>MainWindows</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\FractoriumParams.cpp">
|
||||||
|
<Filter>MainWindows</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\FractoriumXforms.cpp">
|
||||||
|
<Filter>MainWindows</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\FractoriumXformsColor.cpp">
|
||||||
|
<Filter>MainWindows</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\FractoriumXformsAffine.cpp">
|
||||||
|
<Filter>MainWindows</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\FractoriumXformsVariations.cpp">
|
||||||
|
<Filter>MainWindows</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\FractoriumXformsXaos.cpp">
|
||||||
|
<Filter>MainWindows</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\FractoriumPalette.cpp">
|
||||||
|
<Filter>MainWindows</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\FractoriumLibrary.cpp">
|
||||||
|
<Filter>MainWindows</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\FractoriumInfo.cpp">
|
||||||
|
<Filter>MainWindows</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\FractoriumMenus.cpp">
|
||||||
|
<Filter>MainWindows</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\FractoriumRender.cpp">
|
||||||
|
<Filter>MainWindows</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\FractoriumSettings.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\FractoriumToolbar.cpp">
|
||||||
|
<Filter>MainWindows</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\FinalRenderEmberController.cpp">
|
||||||
|
<Filter>Controllers</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\FractoriumEmberController.cpp">
|
||||||
|
<Filter>Controllers</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\Source\Fractorium\GLEmberController.cpp">
|
||||||
|
<Filter>Controllers</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Debug\moc_TwoButtonWidget.cpp">
|
||||||
|
<Filter>Generated Files\Debug</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Release\moc_TwoButtonWidget.cpp">
|
||||||
|
<Filter>Generated Files\Release</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\ReleaseNvidia\moc_TwoButtonWidget.cpp">
|
||||||
|
<Filter>Generated Files\ReleaseNvidia</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Debug\moc_TableWidget.cpp">
|
||||||
|
<Filter>Generated Files\Debug</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Release\moc_TableWidget.cpp">
|
||||||
|
<Filter>Generated Files\Release</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\ReleaseNvidia\moc_TableWidget.cpp">
|
||||||
|
<Filter>Generated Files\ReleaseNvidia</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Debug\moc_StealthComboBox.cpp">
|
||||||
|
<Filter>Generated Files\Debug</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Release\moc_StealthComboBox.cpp">
|
||||||
|
<Filter>Generated Files\Release</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\ReleaseNvidia\moc_StealthComboBox.cpp">
|
||||||
|
<Filter>Generated Files\ReleaseNvidia</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Debug\moc_SpinBox.cpp">
|
||||||
|
<Filter>Generated Files\Debug</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Release\moc_SpinBox.cpp">
|
||||||
|
<Filter>Generated Files\Release</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\ReleaseNvidia\moc_SpinBox.cpp">
|
||||||
|
<Filter>Generated Files\ReleaseNvidia</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Debug\moc_OptionsDialog.cpp">
|
||||||
|
<Filter>Generated Files\Debug</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Release\moc_OptionsDialog.cpp">
|
||||||
|
<Filter>Generated Files\Release</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\ReleaseNvidia\moc_OptionsDialog.cpp">
|
||||||
|
<Filter>Generated Files\ReleaseNvidia</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Debug\moc_GLWidget.cpp">
|
||||||
|
<Filter>Generated Files\Debug</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Release\moc_GLWidget.cpp">
|
||||||
|
<Filter>Generated Files\Release</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\ReleaseNvidia\moc_GLWidget.cpp">
|
||||||
|
<Filter>Generated Files\ReleaseNvidia</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Debug\moc_FractoriumSettings.cpp">
|
||||||
|
<Filter>Generated Files\Debug</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Release\moc_FractoriumSettings.cpp">
|
||||||
|
<Filter>Generated Files\Release</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\ReleaseNvidia\moc_FractoriumSettings.cpp">
|
||||||
|
<Filter>Generated Files\ReleaseNvidia</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Debug\moc_Fractorium.cpp">
|
||||||
|
<Filter>Generated Files\Debug</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Release\moc_Fractorium.cpp">
|
||||||
|
<Filter>Generated Files\Release</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\ReleaseNvidia\moc_Fractorium.cpp">
|
||||||
|
<Filter>Generated Files\ReleaseNvidia</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Debug\moc_FinalRenderDialog.cpp">
|
||||||
|
<Filter>Generated Files\Debug</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Release\moc_FinalRenderDialog.cpp">
|
||||||
|
<Filter>Generated Files\Release</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\ReleaseNvidia\moc_FinalRenderDialog.cpp">
|
||||||
|
<Filter>Generated Files\ReleaseNvidia</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Debug\moc_DoubleSpinBox.cpp">
|
||||||
|
<Filter>Generated Files\Debug</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Release\moc_DoubleSpinBox.cpp">
|
||||||
|
<Filter>Generated Files\Release</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\ReleaseNvidia\moc_DoubleSpinBox.cpp">
|
||||||
|
<Filter>Generated Files\ReleaseNvidia</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Debug\moc_AboutDialog.cpp">
|
||||||
|
<Filter>Generated Files\Debug</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\Release\moc_AboutDialog.cpp">
|
||||||
|
<Filter>Generated Files\Release</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GeneratedFiles\ReleaseNvidia\moc_AboutDialog.cpp">
|
||||||
|
<Filter>Generated Files\ReleaseNvidia</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="GeneratedFiles\ui_Fractorium.h">
|
||||||
|
<Filter>Generated Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\..\glm\glm\glm.hpp">
|
||||||
|
<Filter>Glm</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Fractorium\EmberFile.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Fractorium\FractoriumPch.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="GeneratedFiles\ui_OptionsDialog.h">
|
||||||
|
<Filter>Generated Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="GeneratedFiles\ui_AboutDialog.h">
|
||||||
|
<Filter>Generated Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="GeneratedFiles\ui_FinalRenderDialog.h">
|
||||||
|
<Filter>Generated Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Fractorium\resource.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Fractorium\FinalRenderEmberController.h">
|
||||||
|
<Filter>Controllers</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Fractorium\FractoriumEmberController.h">
|
||||||
|
<Filter>Controllers</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\Fractorium\GLEmberController.h">
|
||||||
|
<Filter>Controllers</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\Source\EmberCommon\EmberCommon.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<CustomBuild Include="..\..\..\Source\Fractorium\Fractorium.qrc">
|
||||||
|
<Filter>Resource Files</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\..\Source\Fractorium\Fractorium.ui">
|
||||||
|
<Filter>Form Files</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\..\Source\Fractorium\OptionsDialog.ui">
|
||||||
|
<Filter>Form Files</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\..\Source\Fractorium\AboutDialog.ui">
|
||||||
|
<Filter>Form Files</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\..\Source\Fractorium\FinalRenderDialog.ui">
|
||||||
|
<Filter>Form Files</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\..\Source\Fractorium\DoubleSpinBox.h">
|
||||||
|
<Filter>Widgets</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\..\Source\Fractorium\TableWidget.h">
|
||||||
|
<Filter>Widgets</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\..\Source\Fractorium\VariationTreeWidgetItem.h">
|
||||||
|
<Filter>Widgets</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\..\Source\Fractorium\AboutDialog.h">
|
||||||
|
<Filter>Dialogs</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\..\Source\Fractorium\FinalRenderDialog.h">
|
||||||
|
<Filter>Dialogs</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\..\Source\Fractorium\OptionsDialog.h">
|
||||||
|
<Filter>Dialogs</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\..\Source\Fractorium\SpinBox.h">
|
||||||
|
<Filter>Widgets</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\..\Source\Fractorium\GLWidget.h">
|
||||||
|
<Filter>MainWindows</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\..\Source\Fractorium\Fractorium.h">
|
||||||
|
<Filter>MainWindows</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\..\Source\Fractorium\EmberTreeWidgetItem.h">
|
||||||
|
<Filter>Widgets</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\..\Source\Fractorium\StealthComboBox.h">
|
||||||
|
<Filter>Widgets</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\..\Source\Fractorium\FractoriumSettings.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\..\Source\Fractorium\TwoButtonWidget.h">
|
||||||
|
<Filter>Widgets</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ResourceCompile Include="..\..\..\Source\Fractorium\Fractorium.rc">
|
||||||
|
<Filter>Resource Files</Filter>
|
||||||
|
</ResourceCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\..\..\Source\Fractorium\Icons\Fractorium.ico" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
@ -0,0 +1,74 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||||
|
<ProductVersion>3.7</ProductVersion>
|
||||||
|
<ProjectGuid>{c8096c47-e358-438c-a520-146d46b0637d}</ProjectGuid>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<OutputName>Fractorium_Beta_0.4.0.2</OutputName>
|
||||||
|
<OutputType>Package</OutputType>
|
||||||
|
<WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
|
||||||
|
<WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||||
|
<OutputPath>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutputPath>
|
||||||
|
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
|
||||||
|
<DefineConstants>Debug</DefineConstants>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||||
|
<OutputPath>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutputPath>
|
||||||
|
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
|
||||||
|
<DefineConstants>Debug</DefineConstants>
|
||||||
|
<OutputPath>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutputPath>
|
||||||
|
<IntermediateOutputPath>obj\$(Platform)\$(Configuration)\</IntermediateOutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
|
||||||
|
<OutputPath>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutputPath>
|
||||||
|
<IntermediateOutputPath>obj\$(Platform)\$(Configuration)\</IntermediateOutputPath>
|
||||||
|
<SuppressPdbOutput>True</SuppressPdbOutput>
|
||||||
|
<WixVariables>
|
||||||
|
</WixVariables>
|
||||||
|
<DefineConstants>GpuType=AMD</DefineConstants>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseNvidia|x86' ">
|
||||||
|
<OutputPath>bin\$(Platform)\$(Configuration)\</OutputPath>
|
||||||
|
<IntermediateOutputPath>obj\$(Platform)\$(Configuration)\</IntermediateOutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseNvidia|x64' ">
|
||||||
|
<SuppressPdbOutput>True</SuppressPdbOutput>
|
||||||
|
<OutputPath>$(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\</OutputPath>
|
||||||
|
<IntermediateOutputPath>obj\$(Platform)\$(Configuration)\</IntermediateOutputPath>
|
||||||
|
<WixVariables>
|
||||||
|
</WixVariables>
|
||||||
|
<DefineConstants>GpuType=NVIDIA</DefineConstants>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseNvidia|AnyCPU' ">
|
||||||
|
<OutputPath>bin\$(Platform)\$(Configuration)\</OutputPath>
|
||||||
|
<IntermediateOutputPath>obj\$(Platform)\$(Configuration)\</IntermediateOutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseNvidia|Any CPU' ">
|
||||||
|
<OutputPath>bin\$(Platform)\$(Configuration)\</OutputPath>
|
||||||
|
<IntermediateOutputPath>obj\$(Platform)\$(Configuration)\</IntermediateOutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Product.wxs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<WixExtension Include="WixUIExtension">
|
||||||
|
<HintPath>$(WixExtDir)\WixUIExtension.dll</HintPath>
|
||||||
|
<Name>WixUIExtension</Name>
|
||||||
|
</WixExtension>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(WixTargetsPath)" />
|
||||||
|
<!--
|
||||||
|
To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Wix.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
186
Builds/MSVC/VS2010/FractoriumInstaller/Product.wxs
Normal file
186
Builds/MSVC/VS2010/FractoriumInstaller/Product.wxs
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
|
||||||
|
<?define ProductVersion="0.4.0.2" ?>
|
||||||
|
<?define ProductName="Fractorium Beta $(var.ProductVersion) ($(var.GpuType))" ?>
|
||||||
|
<?define UpgradeCode="{4714cd15-bfba-44f6-8059-9e1466ebfa6e}"?>
|
||||||
|
<?define Manufacturer="Fractorium"?>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Original GUID,
|
||||||
|
<?define ProductCode="{703001af-6255-4671-9a69-571198b4c0dd}"?>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Change this for every release.
|
||||||
|
-->
|
||||||
|
<?define ProductCode="{9FD6FB01-5C2E-417F-8490-26FFEAE6C24F}"?>
|
||||||
|
|
||||||
|
<Product Id="$(var.ProductCode)" Name="$(var.ProductName)" Language="1033" Version="$(var.ProductVersion)" Manufacturer="$(var.Manufacturer)" UpgradeCode="$(var.UpgradeCode)">
|
||||||
|
<Package
|
||||||
|
Keywords="Installer"
|
||||||
|
Platform="x64"
|
||||||
|
Description="$(var.Manufacturer)"
|
||||||
|
Comments="$(var.Manufacturer)"
|
||||||
|
Manufacturer="$(var.Manufacturer)"
|
||||||
|
InstallScope="perUser"
|
||||||
|
InstallerVersion="400"
|
||||||
|
InstallPrivileges="limited"
|
||||||
|
Compressed="yes"
|
||||||
|
Languages="1033"
|
||||||
|
SummaryCodepage="1252"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Upgrade Id="$(var.UpgradeCode)">
|
||||||
|
<UpgradeVersion Minimum="0.0.0"
|
||||||
|
IncludeMinimum="no"
|
||||||
|
OnlyDetect="no"
|
||||||
|
Maximum="$(var.ProductVersion)"
|
||||||
|
IncludeMaximum="no"
|
||||||
|
Property="PREVIOUSFOUND" />
|
||||||
|
</Upgrade>
|
||||||
|
|
||||||
|
<InstallExecuteSequence>
|
||||||
|
<RemoveExistingProducts After="InstallInitialize"/>
|
||||||
|
</InstallExecuteSequence>
|
||||||
|
|
||||||
|
<MediaTemplate EmbedCab="yes" />
|
||||||
|
|
||||||
|
<Icon Id="AddRemoveProgramsIcon" SourceFile="$(var.SolutionDir)..\..\..\Source\Fractorium\Icons\Fractorium.ico"/>
|
||||||
|
<Property Id="ARPPRODUCTICON" Value="AddRemoveProgramsIcon" />
|
||||||
|
<Feature Id="MainApplication" Title="Main Application" Level="1">
|
||||||
|
<ComponentGroupRef Id="ProductComponents" />
|
||||||
|
<ComponentGroupRef Id="PlatformComponents" />
|
||||||
|
<ComponentRef Id="FractoriumStartMenuShortcut"/>
|
||||||
|
<ComponentRef Id="FractoriumDesktopShortcut"/>
|
||||||
|
</Feature>
|
||||||
|
|
||||||
|
<WixVariable Id="WixUILicenseRtf" Value="$(var.SolutionDir)..\..\..\Data\gplv3.rtf" />
|
||||||
|
<WixVariable Id="WixUIBannerBmp" Value="$(var.SolutionDir)..\..\..\Source\Fractorium\Icons\banner.bmp" /><!--493 x 58 pixels -->
|
||||||
|
<WixVariable Id="WixUIDialogBmp" Value="$(var.SolutionDir)..\..\..\Source\Fractorium\Icons\dialog.bmp" /><!--493 × 312 pixels -->
|
||||||
|
|
||||||
|
<Property Id="MSIUSEREALADMINDETECTION" Value="1" />
|
||||||
|
<Property Id="MSIFASTINSTALL" Value="1" />
|
||||||
|
|
||||||
|
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />
|
||||||
|
<UIRef Id="WixUI_InstallDir" />
|
||||||
|
<UIRef Id="WixUI_ErrorProgressText" />
|
||||||
|
</Product>
|
||||||
|
|
||||||
|
<Fragment>
|
||||||
|
<Directory Id="TARGETDIR" Name="SourceDir" >
|
||||||
|
<!-- Doing this requires admin access, so we don't do it.
|
||||||
|
<Directory Id="ProgramFiles64Folder" >
|
||||||
|
<Directory Id="INSTALLFOLDER" Name="Fractorium" >
|
||||||
|
<Directory Id="INSTALLFOLDERPLATFORMS" Name="platforms" />
|
||||||
|
</Directory>
|
||||||
|
</Directory>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- Doing this doesn't require admin access.
|
||||||
|
It reports a ton of errors, but oddly enough, an MSI is still created with the errors.
|
||||||
|
-->
|
||||||
|
<Directory Id="AppDataFolder" >
|
||||||
|
<Directory Id="INSTALLFOLDER" Name="Fractorium" >
|
||||||
|
<Directory Id="INSTALLFOLDERPLATFORMS" Name="platforms" />
|
||||||
|
</Directory>
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
<!-- Shortcut folders-->
|
||||||
|
<Directory Id="ProgramMenuFolder" Name="Programs">
|
||||||
|
<Directory Id="ProgramMenuDirLevel1" Name="Fractorium" />
|
||||||
|
</Directory>
|
||||||
|
<Directory Id="DesktopFolder" Name="Desktop" />
|
||||||
|
</Directory>
|
||||||
|
</Fragment>
|
||||||
|
|
||||||
|
<Fragment>
|
||||||
|
<Component Id="FractoriumStartMenuShortcut" Directory="ProgramMenuDirLevel1" Guid="f1eaf3ba-9b61-48b6-8994-49ebc6b405aa">
|
||||||
|
<Shortcut Id="FractoriumStartMenuShortcut"
|
||||||
|
Directory="ProgramMenuDirLevel1"
|
||||||
|
Name="Fractorium"
|
||||||
|
Target="[INSTALLFOLDER]\Fractorium.exe"
|
||||||
|
WorkingDirectory="INSTALLFOLDER"
|
||||||
|
Icon="AddRemoveProgramsIcon"
|
||||||
|
/>
|
||||||
|
<Condition>1</Condition>
|
||||||
|
<RemoveFolder Id="FractoriumStartMenuShortcut" On="uninstall" />
|
||||||
|
<RegistryValue Root='HKCU' Key='Software\[Manufacturer]\[ProductName]' Type='string' Value='' KeyPath='yes' />
|
||||||
|
</Component>
|
||||||
|
<Component Id="FractoriumDesktopShortcut" Directory="DesktopFolder" Guid="b73ff21c-08ac-47ad-a510-b3ce90e43979">
|
||||||
|
<Shortcut Id="FractoriumDesktopShortcut"
|
||||||
|
Directory="DesktopFolder"
|
||||||
|
Name="Fractorium"
|
||||||
|
Target="[INSTALLFOLDER]\Fractorium.exe"
|
||||||
|
WorkingDirectory="INSTALLFOLDER"
|
||||||
|
Icon="AddRemoveProgramsIcon"
|
||||||
|
/>
|
||||||
|
<RemoveFolder Id="FractoriumDesktopShortcut" On="uninstall" />
|
||||||
|
<Condition>1</Condition>
|
||||||
|
<RegistryValue Root='HKCU' Key='Software\[Manufacturer]\[ProductName]' Type='string' Value='' KeyPath='yes' />
|
||||||
|
</Component>
|
||||||
|
</Fragment>
|
||||||
|
|
||||||
|
<Fragment>
|
||||||
|
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
|
||||||
|
<Component Id="Fractorium.exe" Guid="ccc04ca4-c747-4330-8cfd-bdd943b185c0">
|
||||||
|
<File Id="Fractorium.exe" Source="$(var.SolutionDir)..\..\..\Bin\$(var.Platform)\$(var.Configuration)\Fractorium.exe" KeyPath="yes" Checksum="yes" ProcessorArchitecture="x64" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="EmberRender.exe" Guid="12d49219-9269-495a-b8e4-3d33cb32d280">
|
||||||
|
<File Id="EmberRender.exe" Source="$(var.SolutionDir)..\..\..\Bin\$(var.Platform)\$(var.Configuration)\EmberRender.exe" KeyPath="yes" Checksum="yes" ProcessorArchitecture="x64" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="EmberAnimate.exe" Guid="ae362704-93a3-48dc-a13b-7c4eabd87ee1">
|
||||||
|
<File Id="EmberAnimate.exe" Source="$(var.SolutionDir)..\..\..\Bin\$(var.Platform)\$(var.Configuration)\EmberAnimate.exe" KeyPath="yes" Checksum="yes" ProcessorArchitecture="x64" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="EmberGenome.exe" Guid="7a93f079-216a-4d1c-9b02-8ca93a6a8daa">
|
||||||
|
<File Id="EmberGenome.exe" Source="$(var.SolutionDir)..\..\..\Bin\$(var.Platform)\$(var.Configuration)\EmberGenome.exe" KeyPath="yes" Checksum="yes" ProcessorArchitecture="x64" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="Ember.dll" Guid="c0f80dee-7a16-4d6a-b7ed-d6cd162154eb">
|
||||||
|
<File Id="Ember.dll" Source="$(var.SolutionDir)..\..\..\Bin\$(var.Platform)\$(var.Configuration)\Ember.dll" KeyPath="yes" Checksum="yes" ProcessorArchitecture="x64"/>
|
||||||
|
</Component>
|
||||||
|
<Component Id="EmberCL.dll" Guid="21c0e372-c605-4e0d-9ba8-94e38949833b">
|
||||||
|
<File Id="EmberCL.dll" Source="$(var.SolutionDir)..\..\..\Bin\$(var.Platform)\$(var.Configuration)\EmberCL.dll" KeyPath="yes" Checksum="yes" ProcessorArchitecture="x64"/>
|
||||||
|
</Component>
|
||||||
|
<Component Id="libpng16.dll" Guid="0a1605f8-e041-45a3-956b-10efdfa9da20">
|
||||||
|
<File Id="libpng16.dll" Source="$(var.SolutionDir)..\..\..\Bin\$(var.Platform)\Release\libpng16.dll" KeyPath="yes" Checksum="yes" ProcessorArchitecture="x64"/>
|
||||||
|
</Component>
|
||||||
|
<Component Id="libxml2.dll" Guid="bb3aa687-7a3d-4d16-a27c-28529b472754">
|
||||||
|
<File Id="libxml2.dll" Source="$(var.SolutionDir)..\..\..\Bin\$(var.Platform)\Release\libxml2.dll" KeyPath="yes" Checksum="yes" ProcessorArchitecture="x64"/>
|
||||||
|
</Component>
|
||||||
|
<Component Id="tbb.dll" Guid="ffa1b2ec-32d5-41aa-9380-fb04d8139103">
|
||||||
|
<File Id="tbb.dll" Source="$(var.SolutionDir)..\..\..\Bin\$(var.Platform)\Release\tbb.dll" KeyPath="yes" Checksum="yes" ProcessorArchitecture="x64"/>
|
||||||
|
</Component>
|
||||||
|
<Component Id="msvcp100.dll" Guid="8f1ffde7-c1bd-45fb-8bc8-26dde552eafd">
|
||||||
|
<File Id="msvcp100.dll" Source="$(var.ProjectDir)\msvcp100.dll" KeyPath="yes" Checksum="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="msvcr100.dll" Guid="50c9bc27-c547-4a03-9f6c-cd416f449dd8">
|
||||||
|
<File Id="msvcr100.dll" Source="$(var.ProjectDir)\msvcr100.dll" KeyPath="yes" Checksum="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="flam3palettes.xml" Guid="d3adb0bb-14ef-4923-99d9-a5784b7ef04e">
|
||||||
|
<File Id="flam3palettes.xml" Source="$(var.SolutionDir)..\..\..\Data\flam3-palettes.xml" KeyPath="yes" Checksum="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="VersionHistory.txt" Guid="8b031217-9e7d-4700-9ab8-2593a4e002b6">
|
||||||
|
<File Id="VersionHistory.txt" Source="$(var.SolutionDir)..\..\..\Data\Version History.txt" KeyPath="yes" Checksum="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="Qt5Core.dll" Guid="0198dd4b-9bbb-4ea2-86e3-6ea0f4f6ac51">
|
||||||
|
<File Id="Qt5Core.dll" Source="$(env.QTDIR)\bin\Qt5Core.dll" KeyPath="yes" Checksum="yes" ProcessorArchitecture="x64"/>
|
||||||
|
</Component>
|
||||||
|
<Component Id="Qt5Gui.dll" Guid="7f93dcc2-55db-4920-83d7-e06c23f7719a">
|
||||||
|
<File Id="Qt5Gui.dll" Source="$(env.QTDIR)\bin\Qt5Gui.dll" KeyPath="yes" Checksum="yes" ProcessorArchitecture="x64"/>
|
||||||
|
</Component>
|
||||||
|
<Component Id="Qt5OpenGL.dll" Guid="dad0a1ca-366c-4df8-aaa1-ae0de31f157a">
|
||||||
|
<File Id="Qt5OpenGL.dll" Source="$(env.QTDIR)\bin\Qt5OpenGL.dll" KeyPath="yes" Checksum="yes" ProcessorArchitecture="x64"/>
|
||||||
|
</Component>
|
||||||
|
<Component Id="Qt5Widgets.dll" Guid="006bb2f1-7a38-426f-ba2c-5196d1d6c24d">
|
||||||
|
<File Id="Qt5Widgets.dll" Source="$(env.QTDIR)\bin\Qt5Widgets.dll" KeyPath="yes" Checksum="yes" ProcessorArchitecture="x64"/>
|
||||||
|
</Component>
|
||||||
|
</ComponentGroup>
|
||||||
|
</Fragment>
|
||||||
|
|
||||||
|
<Fragment>
|
||||||
|
<ComponentGroup Id="PlatformComponents" Directory="INSTALLFOLDERPLATFORMS">
|
||||||
|
<Component Id="qwindows.dll" Guid="627b7f5a-8fa6-4c78-a6b7-81fcdd8fdd63">
|
||||||
|
<File Id="qwindows.dll" Source="$(env.QTDIR)\plugins\platforms\qwindows.dll" KeyPath="yes" Checksum="yes" ProcessorArchitecture="x64"/>
|
||||||
|
</Component>
|
||||||
|
</ComponentGroup>
|
||||||
|
</Fragment>
|
||||||
|
</Wix>
|
BIN
Builds/MSVC/VS2010/FractoriumInstaller/msvcp100.dll
Normal file
BIN
Builds/MSVC/VS2010/FractoriumInstaller/msvcp100.dll
Normal file
Binary file not shown.
BIN
Builds/MSVC/VS2010/FractoriumInstaller/msvcr100.dll
Normal file
BIN
Builds/MSVC/VS2010/FractoriumInstaller/msvcr100.dll
Normal file
Binary file not shown.
277
Builds/MSVC/VS2010/ReadMe.txt
Normal file
277
Builds/MSVC/VS2010/ReadMe.txt
Normal file
@ -0,0 +1,277 @@
|
|||||||
|
License Info:
|
||||||
|
|
||||||
|
This software is licensed under GPL v3.
|
||||||
|
Copyright Matt Feemster from 2012 on...
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
FLAM3:
|
||||||
|
|
||||||
|
FLAM3 - cosmic recursive fractal flames
|
||||||
|
Copyright (C) 1992-2009 Spotworks LLC
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Cuburn:
|
||||||
|
|
||||||
|
Copyright 2010, 2011 Steven Robertson and Erik Reckase.
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Fractron 9000:
|
||||||
|
|
||||||
|
Copyright 2010 Mike Thiesen.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Apophysis:
|
||||||
|
|
||||||
|
Copyright 2001 - 2012 Mark Townsend, Ronald Hordijk, Peter Sdobnov, Piotr Borys, Georg Kiehne.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Qt:
|
||||||
|
|
||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
|
||||||
|
The Qt Toolkit is Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
|
||||||
|
Contact: http://www.qt-project.org/legal
|
||||||
|
|
||||||
|
You may use, distribute and copy the Qt GUI Toolkit under the terms of
|
||||||
|
GNU Lesser General Public License version 2.1, which is displayed below.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
glm:
|
||||||
|
|
||||||
|
The MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2005 - 2013 G-Truc Creation
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Threading Building Blocks:
|
||||||
|
|
||||||
|
Copyright Intel Corporation.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
libjpeg:
|
||||||
|
|
||||||
|
Copyright (C) 1994-2011, Thomas G. Lane, Guido Vollbeding.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
libpng:
|
||||||
|
|
||||||
|
libpng versions 1.2.6, August 15, 2004, through 1.6.0, February 14, 2013, are
|
||||||
|
Copyright (c) 2004, 2006-2012 Glenn Randers-Pehrson, and are
|
||||||
|
distributed according to the same disclaimer and license as libpng-1.2.5
|
||||||
|
with the following individual added to the list of Contributing Authors
|
||||||
|
|
||||||
|
Cosmin Truta
|
||||||
|
|
||||||
|
libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
|
||||||
|
Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
|
||||||
|
distributed according to the same disclaimer and license as libpng-1.0.6
|
||||||
|
with the following individuals added to the list of Contributing Authors
|
||||||
|
|
||||||
|
Simon-Pierre Cadieux
|
||||||
|
Eric S. Raymond
|
||||||
|
Gilles Vollant
|
||||||
|
|
||||||
|
and with the following additions to the disclaimer:
|
||||||
|
|
||||||
|
There is no warranty against interference with your enjoyment of the
|
||||||
|
library or against infringement. There is no warranty that our
|
||||||
|
efforts or the library will fulfill any of your particular purposes
|
||||||
|
or needs. This library is provided with all faults, and the entire
|
||||||
|
risk of satisfactory quality, performance, accuracy, and effort is with
|
||||||
|
the user.
|
||||||
|
|
||||||
|
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
||||||
|
Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
|
||||||
|
distributed according to the same disclaimer and license as libpng-0.96,
|
||||||
|
with the following individuals added to the list of Contributing Authors:
|
||||||
|
|
||||||
|
Tom Lane
|
||||||
|
Glenn Randers-Pehrson
|
||||||
|
Willem van Schaik
|
||||||
|
|
||||||
|
libpng versions 0.89, June 1996, through 0.96, May 1997, are
|
||||||
|
Copyright (c) 1996, 1997 Andreas Dilger
|
||||||
|
Distributed according to the same disclaimer and license as libpng-0.88,
|
||||||
|
with the following individuals added to the list of Contributing Authors:
|
||||||
|
|
||||||
|
John Bowler
|
||||||
|
Kevin Bracey
|
||||||
|
Sam Bushell
|
||||||
|
Magnus Holmgren
|
||||||
|
Greg Roelofs
|
||||||
|
Tom Tanner
|
||||||
|
|
||||||
|
libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
||||||
|
Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
|
|
||||||
|
For the purposes of this copyright and license, "Contributing Authors"
|
||||||
|
is defined as the following set of individuals:
|
||||||
|
|
||||||
|
Andreas Dilger
|
||||||
|
Dave Martindale
|
||||||
|
Guy Eric Schalnat
|
||||||
|
Paul Schmidt
|
||||||
|
Tim Wegner
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
libxml2:
|
||||||
|
|
||||||
|
Except where otherwise noted in the source code (e.g. the files hash.c,
|
||||||
|
list.c and the trio files, which are covered by a similar licence but
|
||||||
|
with different Copyright notices) all the files are:
|
||||||
|
|
||||||
|
Copyright (C) 1998-2003 Daniel Veillard. All Rights Reserved.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is fur-
|
||||||
|
nished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
|
||||||
|
NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
|
||||||
|
NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
Except as contained in this notice, the name of Daniel Veillard shall not
|
||||||
|
be used in advertising or otherwise to promote the sale, use or other deal-
|
||||||
|
ings in this Software without prior written authorization from him.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
zlib:
|
||||||
|
|
||||||
|
(C) 1995-2012 Jean-loup Gailly and Mark Adler
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
Jean-loup Gailly Mark Adler
|
||||||
|
jloup@gzip.org madler@alumni.caltech.edu
|
||||||
|
|
||||||
|
If you use the zlib library in a product, we would appreciate *not* receiving
|
||||||
|
lengthy legal documents to sign. The sources are provided for free but without
|
||||||
|
warranty of any kind. The library has been entirely written by Jean-loup
|
||||||
|
Gailly and Mark Adler; it does not include third-party code.
|
||||||
|
|
||||||
|
If you redistribute modified sources, we would appreciate that you include in
|
||||||
|
the file ChangeLog history information documenting your changes. Please read
|
||||||
|
the FAQ for more information on the distribution of modified source versions.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
ISAAC/QTISAAC:
|
||||||
|
|
||||||
|
Robert Jenkins, Quinn Tyler Jackson
|
||||||
|
Public Domain
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
MWC 64:
|
||||||
|
|
||||||
|
Copyright (c) 2011, David Thomas
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of Imperial College London nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
|
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
SimpleOpt:
|
||||||
|
|
||||||
|
Copyright (c) 2006-2013, Brodie Thiesfield
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
See About Box for links and licenses for icons.
|
37
Builds/MSVC/VS2010/zlib.props
Normal file
37
Builds/MSVC/VS2010/zlib.props
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
* zlib.props - location of zlib source
|
||||||
|
*
|
||||||
|
* libpng version 1.5.12 - July 11, 2012
|
||||||
|
*
|
||||||
|
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||||
|
*
|
||||||
|
* This code is released under the libpng license.
|
||||||
|
* For conditions of distribution and use, see the disclaimer
|
||||||
|
* and license in png.h
|
||||||
|
|
||||||
|
* You must edit this file to record the location of the zlib
|
||||||
|
* source code.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Project ToolsVersion="4.0"
|
||||||
|
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<!-- Place the name of the directory containing the source of zlib used for
|
||||||
|
debugging in this property.
|
||||||
|
|
||||||
|
The directory need only contain the '.c' and '.h' files from the
|
||||||
|
source.
|
||||||
|
|
||||||
|
If you use a relative directory name (as below) then it must be
|
||||||
|
relative to the project directories; these are one level deepers than
|
||||||
|
the directories containing this file.
|
||||||
|
|
||||||
|
If the version of zlib you use does not match that used when the
|
||||||
|
distribution was built you will get warnings from pngtest that the zlib
|
||||||
|
versions do not match. The zlib version used in this build is recorded
|
||||||
|
below:
|
||||||
|
-->
|
||||||
|
<ZLibSrcDir>..\..\..\..\zlib</ZLibSrcDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
BIN
Data/Variations.xlsx
Normal file
BIN
Data/Variations.xlsx
Normal file
Binary file not shown.
686
Data/Version History.txt
Normal file
686
Data/Version History.txt
Normal file
@ -0,0 +1,686 @@
|
|||||||
|
0.4.0.1 Beta 07/06/2014
|
||||||
|
--Bug Fixes
|
||||||
|
Fix name collision of mobius and Mobius. The former is treated as mobius_strip.
|
||||||
|
|
||||||
|
0.4.0.0 Beta 07/06/2014
|
||||||
|
--User Changes
|
||||||
|
Addition of over 200 new variations.
|
||||||
|
Almost all variations now come with pre and post version. Bringing the total to almost 900. Pre/post are omitted for some direct coloring variations.
|
||||||
|
Support for 3D fields from Apophysis: cam_zpos, cam_persp, cam_yaw, cam_pitch, cam_dof.
|
||||||
|
Support for direct coloring dc_ variations.
|
||||||
|
Allow for saturation spin box to go negative like Apo does.
|
||||||
|
Select all when first clicking in any of the spin boxes.
|
||||||
|
Add a Clear Xaos button to easily reset all xaos values to 1.
|
||||||
|
Default threads to processors - 1 for first time users to keep the UI more responsive.
|
||||||
|
The following variations have extra precalcs added to them and should run faster: bent2, bipolar, blob, cpow, curve, escher, fan2, flux, modulus, oscilloscope, rings2, separation, split, wedge.
|
||||||
|
|
||||||
|
--Bug Fixes
|
||||||
|
The wrong visibility value was being used on final xforms.
|
||||||
|
The options dialog was not being restored to the previous UI state when the user clicked cancel.
|
||||||
|
Pie variation was not properly using the slices parameter.
|
||||||
|
Erroneously included gutter when computing bounds and units of OpenGL display window.
|
||||||
|
Needlessly calling floor() when calculating histogram index during point accumulation.
|
||||||
|
|
||||||
|
--Code Changes
|
||||||
|
DoubleSpinBox
|
||||||
|
Change step.
|
||||||
|
Allow for selecting all on click by making the line edit a custom derived class.
|
||||||
|
|
||||||
|
Ember
|
||||||
|
Add new fields and functions for 3D projection.
|
||||||
|
Add new export macro to handle pre, regular and post variations.
|
||||||
|
Add function to get a list of pointers to the variations present in all xforms with no duplicates and only single entries for reg, pre and post types. Used to construct OpenCL function strings.
|
||||||
|
Better calling of CacheXforms() in interpolate.
|
||||||
|
|
||||||
|
EmberAnimate, EmberGenome, EmberRender
|
||||||
|
Print platform and device information when running with OpenCL.
|
||||||
|
|
||||||
|
EmberCLFunctions
|
||||||
|
Add new global math functions to correspond to the ones added in Utils.
|
||||||
|
|
||||||
|
EmberCLStructs
|
||||||
|
Add support for 3D fields.
|
||||||
|
Make m_LastXfUsed be a member of PointCL, rather than a local variable declared in the kernel.
|
||||||
|
|
||||||
|
EmberDefines
|
||||||
|
Add a define to only instantiate float type. Useful for reducing build times while debugging, and removed on release.
|
||||||
|
Add defines: M_2PI, M_3PI, CUBE, TLOW, TMAX, m3T, acosh and fma. The last two will be removed once the project moves to C++11 in the future.
|
||||||
|
|
||||||
|
EmberFile
|
||||||
|
Add UniqueFilename() function to ensure what we save is never overwritten with subsequent saves.
|
||||||
|
|
||||||
|
EmberTester
|
||||||
|
Add many test functions to test the integrity of the Variations design. This will be made into a formal testing suite in the future, but for now is just a collection of global functions.
|
||||||
|
|
||||||
|
EmberToXml
|
||||||
|
Write out legacy symmetry field in addition to color speed for each xform.
|
||||||
|
Write out name field for each xform for Apo compatibility.
|
||||||
|
|
||||||
|
FinalRenderDialog
|
||||||
|
Add MoveCursorToEnd() signal function to be called from the final render thread.
|
||||||
|
|
||||||
|
FinalRenderEmberController
|
||||||
|
Call invokeMethod to move cursor to the end rather than directly. This was possibly causing intermittent crashes before.
|
||||||
|
When saving on render complete, call new UniqueFilename() function for saving both the xml and the image to ensure no overwriting occurs.
|
||||||
|
|
||||||
|
Fractorium
|
||||||
|
Add functions to support 3D.
|
||||||
|
|
||||||
|
FractoriumColor
|
||||||
|
Add fields and functions to support direct coloring.
|
||||||
|
|
||||||
|
FractoriumPalette
|
||||||
|
Allow for saturation to go negative like Apo does.
|
||||||
|
|
||||||
|
FractoriumParams
|
||||||
|
Add functions to support 3D.
|
||||||
|
|
||||||
|
FractoriumVariations
|
||||||
|
Add min/max range for params.
|
||||||
|
Call SetParamVal() on spinner change rather than directly assining to the param to ensure values are in a valid range.
|
||||||
|
|
||||||
|
Interpolate
|
||||||
|
Use new SetParamVal() function for interpolating all params. This ensures the interpolated values are in the proper range specified by each variation.
|
||||||
|
Use M_2PI constant.
|
||||||
|
|
||||||
|
Isaac
|
||||||
|
Make ALPHA template argument 4 instead of 8 for more compactness.
|
||||||
|
Make functions inline.
|
||||||
|
Add check for modulo zero in ranged Rand().
|
||||||
|
|
||||||
|
Iterator
|
||||||
|
Add support for 3D projections.
|
||||||
|
During fuse loop, iterate on the same point rather than to the samples buffer to be more cache friendly. Gives a ~1% speedup.
|
||||||
|
|
||||||
|
IterOpenCLKernelCreator
|
||||||
|
Add support for 3D projections.
|
||||||
|
Add support for new pre/reg/post variation design.
|
||||||
|
Directly assign points rather than doing one field at a time.
|
||||||
|
|
||||||
|
OptionsDialog
|
||||||
|
Add reject() function to restore the UI to the previous state when the user clicks cancel.
|
||||||
|
|
||||||
|
PaletteList
|
||||||
|
Remove Isaac member and use the new global one instead.
|
||||||
|
|
||||||
|
Point
|
||||||
|
Add m_Z member for 3D.
|
||||||
|
|
||||||
|
Renderer
|
||||||
|
Make temporary Isaac seeds buffer match 1 << ISAAC_SIZE, rather than hard code to 256.
|
||||||
|
|
||||||
|
RendererCL
|
||||||
|
Copy new 3D and DC fields to EmberCL object.
|
||||||
|
|
||||||
|
Utils
|
||||||
|
Add a global Isaac object for use in places where none exists. Only to be used in single threaded scenarios.
|
||||||
|
Add many functions for use in new variations: ClampMod(), ClampLteRef(), Sign(), Sqr(), SafeSqrt(), Cube(), Hypot(), Spread(), Powq4(), Powq4c(), Zeps(), Lerp(), Fabsmod(), Fosc(), Foscn(), LogScale(), LogMap().
|
||||||
|
Add new int Floor<T>(T val) function that is faster than the system floor() and use it everywhere. Time test proved to be faster.
|
||||||
|
|
||||||
|
Variation
|
||||||
|
Complete redesign of variations. Split into multiple files to avoid one becoming unweildy.
|
||||||
|
Each variation will have a type: pre, regular or post, and will have an assignment type that dictates how the results will be assigned to the output points: direct assign or sum, to be used in pre and post variations. Regular ones always sum.
|
||||||
|
Variation enums are now sorted alphabetically rather than the traditional arbitrary sorting of flam3.
|
||||||
|
Add Precalc() and PrecalcOpenCLString() functions to be called with pre and post variations. Placed here instead of xform because they depend on the variation type, pre or post.
|
||||||
|
Add additional functions to help handle pre/post logic and naming.
|
||||||
|
Add fields to specify valid value ranges for parametric params. Taken from Apo.
|
||||||
|
Reserve 5 for params vector in parametric variations.
|
||||||
|
Add randomization function for parametric variations.
|
||||||
|
Use new range and value checked Set() function in CopyParamVals() instead of directly assigning values.
|
||||||
|
Add non-null checks in copy macros to delete to prevent a memory leak.
|
||||||
|
Add new macros to handle creating and copying pre and post variations.
|
||||||
|
|
||||||
|
VariationList
|
||||||
|
Add new macro for handling the adding of pre, regular, and post variations.
|
||||||
|
Add three new vectors to hold pointers, but not copies, to pre, regular and post variations.
|
||||||
|
Add helper function GetVariationCopy().
|
||||||
|
|
||||||
|
Xform
|
||||||
|
Add direct color support.
|
||||||
|
Major rework of Apply() function to use new style of pre/reg/post variations as well as direct coloring.
|
||||||
|
Add Read() functions and their OpenCL counterparts, to handle reading from the appropriate inputs for pre and post variations.
|
||||||
|
Move members around to match the order they're accessed to be more cache friendly.
|
||||||
|
|
||||||
|
XmlToEmber
|
||||||
|
Add support for 3D fields, direct color, and the legacy symmetry field.
|
||||||
|
Correct poorly named variations and their parameters.
|
||||||
|
Remove Isaac member and use the new global one instead.
|
||||||
|
|
||||||
|
|
||||||
|
0.3.7.3 Beta 05/04/2014 (Intermediate commit without an associated release)
|
||||||
|
--User Changes
|
||||||
|
Fix a bug that reset the render when adjusting a parameter of a variation whose weight was zero. Now only update the render if the variation is actually present with a non-zero weight.
|
||||||
|
Add many new variations, with more to come. Any Z coordinate functionality has been commented out for the time being until 3D support is added.
|
||||||
|
Preserve xform index during undo/redo.
|
||||||
|
In EmberRender and EmberAnimate, report iters as ran/requested rather than requested/ran.
|
||||||
|
|
||||||
|
--Code Changes
|
||||||
|
Solution
|
||||||
|
Update glm, libjpeg, libpng, libxml2 and tbb to their latest versions.
|
||||||
|
Change include/link order for every project for all configurations and platforms to prefer AMD over nVidia since AMD's OpenCL support is more current.
|
||||||
|
|
||||||
|
Variations
|
||||||
|
Split variations into three files, Variation.h, PreVariations.h, and PostVariations.h.
|
||||||
|
Add many new variations from the Apophysis plugins.
|
||||||
|
Place Variations in their own project filter folder in Ember.
|
||||||
|
|
||||||
|
Affine2D
|
||||||
|
Change the name of the template parameter to T instead of Tt.
|
||||||
|
Make T() function O().
|
||||||
|
Remove glm typedefs, they are global now.
|
||||||
|
|
||||||
|
EmberDefines
|
||||||
|
Add some new constant defines.
|
||||||
|
Add global glm defines.
|
||||||
|
|
||||||
|
Utils
|
||||||
|
Add some additional rounding functions needed in the newly added variations.
|
||||||
|
|
||||||
|
Xform
|
||||||
|
Split variations into three separate lists for regular, pre and post variations.
|
||||||
|
Add new function to retrieve the total variation count between all three lists.
|
||||||
|
Add other various functionality to handle the three lists.
|
||||||
|
|
||||||
|
EmberCLFunctions
|
||||||
|
Add OpenCL equivalent of new rounding functions.
|
||||||
|
|
||||||
|
EmberCLStructs
|
||||||
|
Add OpenCL equivalent of new constant defines.
|
||||||
|
Rearrange the members of the structures to match the order they are used in, and remove unused members.
|
||||||
|
|
||||||
|
IterOpenCLKernelCreator
|
||||||
|
Add support for the three variations lists in each xform.
|
||||||
|
|
||||||
|
OpenCLWrapper
|
||||||
|
Add #define to use Image2DGL for OpenCL 1.1 on nVidia, or ImageGL for OpenCL 1.2 on AMD.
|
||||||
|
Fix a glaring bug (device and platform = 0 in the constructor) that was compiling, but was causing an out of bounds memory read under the covers and was only detected in debug mode.
|
||||||
|
|
||||||
|
|
||||||
|
0.3.7.2 Beta 04/16/2014
|
||||||
|
--User Changes
|
||||||
|
Fix bug where images with a high number of bad values would crash the rendering process on nVidia cards.
|
||||||
|
Disable mouse wheel scrolling when it's held down for panning. This makes panning easier on sensitive mice.
|
||||||
|
|
||||||
|
--Code Changes
|
||||||
|
|
||||||
|
Variations
|
||||||
|
Begin implementing more variations from Apophysis, but leave them disabled for now.
|
||||||
|
|
||||||
|
Ember
|
||||||
|
Fixed a bug when adding symmetry to an ember that sorted all of the xforms by color speed value, instead of only the newly added symmetry xforms.
|
||||||
|
|
||||||
|
IterOpenCLKernelCreator
|
||||||
|
Fixed a bug where final xform was considered for the randomly selected xform during each iteration. It was never actually hit, but should have never been there regardless.
|
||||||
|
Major change in how bad values were being handled. They were failing out on nVidia but running ok on AMD, but giving worse images. Now it's done in a while loop to avoid severe warp divergence.
|
||||||
|
|
||||||
|
|
||||||
|
0.3.7.1 Beta 04/07/2014
|
||||||
|
--User Changes
|
||||||
|
Fixed a bug that accidentally disabled double precision support on nVidia cards in the last commit.
|
||||||
|
|
||||||
|
|
||||||
|
0.3.7.0 Beta 04/06/2014
|
||||||
|
--User Changes
|
||||||
|
Support for most recent AMD cards.
|
||||||
|
Final render dialog is now non-modal, allowing the main window to be minimized while doing a lengthy render.
|
||||||
|
Fixed device selection which was completely broken in the final render dialog.
|
||||||
|
Save backup Xml before rendering starts just in case it crashes mid way through. The backup file is deleted upon successful render completion.
|
||||||
|
Set the GPU_MAX_ALLOC_PERCENT env var to 100 to allow full usage of GPU memory.
|
||||||
|
New --dump_kernel command line option for EmberRender to print the kernel if using OpenCL.
|
||||||
|
Fix hiding of xform indices in the xforms combo when their count was >= 10 by making the combo slightly wider.
|
||||||
|
Add ABCDEF to affine xform values table to clarify the meaning of x1, y1, x2, y2, o1, o2.
|
||||||
|
Variations is now the default shown tab when clicking into the xforms tab.
|
||||||
|
|
||||||
|
--Code Changes
|
||||||
|
|
||||||
|
IterOpenCLKernelCreator, DEOpenCLKernelCreator, OpenCLWrapper
|
||||||
|
Support for AMD.
|
||||||
|
|
||||||
|
EmberCLFunctions
|
||||||
|
Support for AMD.
|
||||||
|
When resizing a buffer, clear the existing one first to avoid having both resident in memory for a brief moment.
|
||||||
|
|
||||||
|
EmberCLStructs
|
||||||
|
Allow for 21 xforms per ember, was previously 17.
|
||||||
|
|
||||||
|
RendererCL
|
||||||
|
Support AMD.
|
||||||
|
Limit variations per xform to MAX_CL_VARS.
|
||||||
|
|
||||||
|
EmberTreeWidgetItem
|
||||||
|
Derive EmberTreeWidgetItem from EmberTreeWidgetItemBase to make casting possible since a templated argument can't be passed to invokeMethod().
|
||||||
|
|
||||||
|
Fractorium
|
||||||
|
New functions to allow updating the preview renders from within a thread better.
|
||||||
|
|
||||||
|
FractoriumLibrary
|
||||||
|
Better flushing of event queues when starting and stopping preview renderer.
|
||||||
|
Place a try/catch block around EmberTreeItemChanged() because it seems to get called spurriously for tree items that have already been deleted.
|
||||||
|
|
||||||
|
FractoriumEmberController
|
||||||
|
Fix bug where Fractorium would crash when opening a new file before the preview renders were finished by doing two things: Updating the thumbnail via invokeMethod() and using BlockingQueuedConnection for that call.
|
||||||
|
|
||||||
|
|
||||||
|
0.3.6.0 Beta 03/11/2014
|
||||||
|
--User Changes
|
||||||
|
Fix bug when using early clip.
|
||||||
|
Fix crash when more than once device is present.
|
||||||
|
Fix bug where saving the current Xml would continually prompt.
|
||||||
|
Fix bug where renderer wouldn't reinitialize after changing platform or device.
|
||||||
|
Add default click values for: brightness, gamma, gamma threshold, vibrancy, highlight power, spatial filter width, min and max DE radius, DE curve,
|
||||||
|
|
||||||
|
--Code Changes
|
||||||
|
|
||||||
|
EmberCL.vcxproj
|
||||||
|
Add paths for AMD APP SDK. Support will be coming in the following months.
|
||||||
|
|
||||||
|
Renderer
|
||||||
|
Fix bug in EarlyClip() function signature that prevented it from being overrided, add const in base.
|
||||||
|
Formatting cleanup.
|
||||||
|
|
||||||
|
EmberCLStructs
|
||||||
|
Remove typedefs for sbyte, byte and uint. They are not needed.
|
||||||
|
|
||||||
|
IterOpenCLKernelCreator
|
||||||
|
Change byte to uchar.
|
||||||
|
|
||||||
|
OpenCLWrapper
|
||||||
|
Fix bug in DeviceAndPlatformNames() that would crash the program when more than one platform was present.
|
||||||
|
|
||||||
|
FractoriumLibrary
|
||||||
|
Fix bug where saving the current Xml would continually prompt.
|
||||||
|
|
||||||
|
FractoriumRenderer
|
||||||
|
Fix bug where renderer wouldn't reinitialize after changing platform or device.
|
||||||
|
|
||||||
|
OptionsDialog
|
||||||
|
Better initialization of the platform/device combo boxes when more than one platform/device is present.
|
||||||
|
|
||||||
|
|
||||||
|
0.3.5.0 Beta 02/14/2014
|
||||||
|
--User Changes
|
||||||
|
Add Hemisphere variation because it was needed for some testing. Many more to follow soon.
|
||||||
|
Integer spin boxes can be scrolled by 1 when shift is held down.
|
||||||
|
Support for dragging and dropping multiple files.
|
||||||
|
Support for DnD and pasting Xml over the current file or appending them to it.
|
||||||
|
Proper behavior when zero variations are present. This differs from flam3, but makes more sense.
|
||||||
|
Preview and scaling options when doing a final render.
|
||||||
|
Bug fix in EmberGenome that would crash when creating a sequence that included embers with final Xforms in them.
|
||||||
|
|
||||||
|
--Code Changes
|
||||||
|
|
||||||
|
Ember
|
||||||
|
Add two members to preserve the original raster width and height of an ember as it was read from file. This is used for aspect ratio calculations later on.
|
||||||
|
|
||||||
|
EmberDefines
|
||||||
|
Add two new enums for render status and scaling preference.
|
||||||
|
|
||||||
|
EmberToXml
|
||||||
|
Make some buffers size 128 instead of 100.
|
||||||
|
Add function AddFilenameWithoutAmpersand() to ensure an ampersand is never added to the edits because Xml can't parse those.
|
||||||
|
Error in ConvertLinearToPolar() was calling GetXform(). Changed to GetTotalXform().
|
||||||
|
|
||||||
|
PaletteList
|
||||||
|
Use a string instead of a vector because it's needed now to deal with ampersands.
|
||||||
|
|
||||||
|
Renderer, RendererCL
|
||||||
|
Rendering functions now no longer return just true or false. Rather, they return an enum indicating whether it ran ok, with an error, or aborted.
|
||||||
|
Ok function was inadvertently made not to be an override in OpenCL. Fixed by adding const to match the base.
|
||||||
|
|
||||||
|
SheepTools
|
||||||
|
Clean up to use our modern design instead of some remnants left over from flam3.
|
||||||
|
Consolidate variation weight normalization to a function call, NormalizeVariationWeights().
|
||||||
|
|
||||||
|
Utils
|
||||||
|
Add some functionality to EmberReport.
|
||||||
|
Add a function FindAndReplace() to replace all isntances of a value within a collection with a specified value.
|
||||||
|
|
||||||
|
Variation, VariationList
|
||||||
|
Formatting cleanup.
|
||||||
|
Add new variation Hemisphere().
|
||||||
|
|
||||||
|
Xform
|
||||||
|
Change the behavior for when zero variations are present to just treat them as linear variations with weight 1.
|
||||||
|
|
||||||
|
XmlToEmber
|
||||||
|
Formatting cleanup.
|
||||||
|
Preserve original raster width and height in new member variables.
|
||||||
|
Reserve space in the embers vector based on a rough estimate of how many are present in the file.
|
||||||
|
Account for strings which contain an ampersand, which Xml can't parse.
|
||||||
|
|
||||||
|
EmberCommon
|
||||||
|
Generalize CreateRenderer() function to work in all scenarios, which reduced code duplication in the GUI.
|
||||||
|
|
||||||
|
EmberRender, EmberAnimate, EmberGenome
|
||||||
|
Better error reporting when renderer creation fails.
|
||||||
|
|
||||||
|
IterOpenCLKernelCreator
|
||||||
|
Update GPU side to use the new Xform behavior when variations are empty.
|
||||||
|
|
||||||
|
DoubleSpinBox
|
||||||
|
Style cleanup.
|
||||||
|
|
||||||
|
EmberFile
|
||||||
|
Remove unused CreateRenderer() function.
|
||||||
|
|
||||||
|
EmberTreeWidgetItem
|
||||||
|
Use RGBA for previews because that's what QPixmap prefers.
|
||||||
|
|
||||||
|
FinalRenderDialog
|
||||||
|
General cleanup.
|
||||||
|
Support for new scaling features.
|
||||||
|
|
||||||
|
FinalRenderEmberController
|
||||||
|
Add support for preview renders.
|
||||||
|
Support for new scaling features.
|
||||||
|
Use new CreateRenderer() function.
|
||||||
|
Use invokeMethod() for all GUI updates inside of the render and preview threads. This was causing an occasional crash before.
|
||||||
|
Preserve the state of some of the checkboxes that were not being saved before.
|
||||||
|
|
||||||
|
Fractorium
|
||||||
|
Add support for drag n drop of multiple files at once.
|
||||||
|
Better drag n drop code.
|
||||||
|
|
||||||
|
FractoriumEmberController
|
||||||
|
Make the preview renderer keep one core free, instead of maxing out all cores.
|
||||||
|
|
||||||
|
FractoriumInfo
|
||||||
|
Use invokeMethod() to account for when ErrorReportToQTextEdit() is called from a thread.
|
||||||
|
|
||||||
|
FractoriumLibrary
|
||||||
|
General cleanup.
|
||||||
|
Add support for undo/redo list.
|
||||||
|
|
||||||
|
FractoriumMenus
|
||||||
|
Add support for undo/redo list.
|
||||||
|
Add support pasting Xml as an append, as well as a replacement.
|
||||||
|
Preserve original dimension with new m_OrigFinalRasW and m_OrigFinalRasH fields.
|
||||||
|
Better handling of unicode and html junk in pasted strings.
|
||||||
|
Stop preview render whenever the open file/list of embers changes in response to user action.
|
||||||
|
|
||||||
|
FractoriumRender
|
||||||
|
Add support for undo/redo list.
|
||||||
|
Clear both front and back screen buffers on the main window when showing the final render dialog.
|
||||||
|
Use new CreateRenderer() function.
|
||||||
|
|
||||||
|
FractoriumSettings
|
||||||
|
General cleanup and reordering.
|
||||||
|
Add support for saving scaling options from the final render dialog.
|
||||||
|
Preserve the state of some of the checkboxes that were not being saved before.
|
||||||
|
|
||||||
|
SpinBox
|
||||||
|
Add a default small step of 1 to be used when scrolling and holding shift. DoubleSpinBox already had this functionality.
|
||||||
|
|
||||||
|
|
||||||
|
0.3.4.0 Beta 01/26/2014
|
||||||
|
--User Changes
|
||||||
|
Fix bug where the last few rows of an image weren't being rendered.
|
||||||
|
Add commas to various command line numerical outputs to make them easier to read.
|
||||||
|
Apply sort mode to variations list every time filter is changed or cleared.
|
||||||
|
Prevent crash when clicking on main window before initialization is complete on program startup.
|
||||||
|
|
||||||
|
--Code Changes
|
||||||
|
|
||||||
|
OpenCLWrapper, RendererCL
|
||||||
|
Refactor to better separate OpenCL detection from initialization. This should help detect devices better.
|
||||||
|
|
||||||
|
EmberOptions
|
||||||
|
Fix small formatting errors in command line help text.
|
||||||
|
|
||||||
|
EmberFile
|
||||||
|
Prevent assign to self.
|
||||||
|
|
||||||
|
|
||||||
|
0.3.3.0 Beta 01/23/2014
|
||||||
|
--User Changes
|
||||||
|
More intelligent checking for OpenCL.
|
||||||
|
Greater zoom amount when scrolling the mouse wheel on the main window.
|
||||||
|
|
||||||
|
0.3.2.0 Beta 01/19/2014
|
||||||
|
--User Changes
|
||||||
|
Add previews to open embers in the Library tab.
|
||||||
|
Allow for starting and stopping the preview renderer.
|
||||||
|
Make library tab first and automatically selected.
|
||||||
|
Fix the ngon and rays variations to use the sum of the squares, instead of their square root. Ngon and rays were completely erroneous before this fix.
|
||||||
|
Add support for copying and pasting Xml text from and into the GUI.
|
||||||
|
Holding shift while scrolling xform weight adjusts the value by 0.001 for more precise manipulation.
|
||||||
|
|
||||||
|
--Code Changes
|
||||||
|
|
||||||
|
CarToRas
|
||||||
|
Prevent assign to self.
|
||||||
|
Remove padded variables for bounds checking, and check bounds properly. Also discovered that even when points are in bounds, the roundoff error from converting to raster can put them out of bounds. Add a final check in Accum.
|
||||||
|
|
||||||
|
DensityFilter
|
||||||
|
General cleanup.
|
||||||
|
Save the filter width (oddly enough, this wasn't being done before).
|
||||||
|
Add a vector of indices that is used in OpenCL to apply the filter by row, rather than moving from the center outward. This fixes a race condition when applying the DE filter on the GPU.
|
||||||
|
Remove FinalMinRad, FinalMaxRad and ActualMaxRad members and accessor functions.
|
||||||
|
|
||||||
|
Affine2D, Color, Ember, Palette, Point, Variation, Xform
|
||||||
|
Prevent assign to self.
|
||||||
|
|
||||||
|
Renderer
|
||||||
|
Fully setup gutter width the way smoulder does.
|
||||||
|
In GaussianDensityFilter(), do a more optimized assignment of the bucket hit count if SS=1.
|
||||||
|
Reorder the assignments for the case (jj == ii) to be cache efficient.
|
||||||
|
In Accumulate(), add one final check after Car to Ras conversion to make absolutely sure it's within bounds. This was the source of a seldom occurring, but lethal memory error.
|
||||||
|
|
||||||
|
EmberToXml
|
||||||
|
Clamp supersample to always be greater than 1 just to be safe.
|
||||||
|
|
||||||
|
XmlToEmber
|
||||||
|
Add a Parse() overload that takes a vector<unsigned char>.
|
||||||
|
More consistent formatting of error messages.
|
||||||
|
Add, but comment out, an attempt to capture missing variations when parsing. Revisit later.
|
||||||
|
|
||||||
|
FractoriumEmberController, FractoriumMenus
|
||||||
|
Properly account for scale when opening from file, dragging and dropping, or pasting Xmls into the GUI.
|
||||||
|
|
||||||
|
FractoriumParams
|
||||||
|
Allow brightness to go to 50 and gamma to go to 9999.
|
||||||
|
Allow spatial filter width to go down to 0.1, was 0.4 before.
|
||||||
|
|
||||||
|
FractoriumRender
|
||||||
|
Renderer was not properly being created when returning from options if params other than OpenCL or double precision were changed. Now properly construct for all options changes.
|
||||||
|
|
||||||
|
FractoriumSettings
|
||||||
|
Default XmlSupersample to 2 if not found in settings file.
|
||||||
|
|
||||||
|
FractoriumXformsAffine
|
||||||
|
Respect world vs. local pivot when flipping affine to mimic Apophysis behavior. Was previously always using world pivot behavior.
|
||||||
|
|
||||||
|
FractoriumXformsColor
|
||||||
|
NULL check for empty pixmap on startup.
|
||||||
|
|
||||||
|
GLWidget
|
||||||
|
Check for m_Init in SetSelectedXform() to avoid recursive paint operation.
|
||||||
|
|
||||||
|
EmberCLStructs
|
||||||
|
Remove pad members from CarToRas structures to mirrow the CPU side.
|
||||||
|
|
||||||
|
EmberCLFunctions
|
||||||
|
Remove AddToAccum functions, they are no longer used with new DE code. Add AccumCheck() function to check bounds, but not accumulate.
|
||||||
|
Change CarToRasInBounds() to check bounds the same way the new CPU code does.
|
||||||
|
|
||||||
|
IterOpenCLKernelCreator
|
||||||
|
Add histSize parameter to kernel.
|
||||||
|
Add (histIndex < histSize) check after call to CarToRasConvertPointToSingle() to match the extra check done on the CPU side now. This will guarantee memory errors will never happen while iterating.
|
||||||
|
|
||||||
|
RendererCL
|
||||||
|
Add support for different block widths and heights for DE.
|
||||||
|
Add a DE coefficients buffer for applying DE by row, which fixes the race condition problem that occurs when applying from the center outward.
|
||||||
|
DE blocksize is now 32x32, unless SS>1 or type is double, in which case they run at 32x30.
|
||||||
|
Add debugging code in GaussianDensityFilter() to fall back to the CPU for testing, leave commented out.
|
||||||
|
|
||||||
|
DEOpenCLKernelCreator
|
||||||
|
Re-design to apply filter by row, rather than from the center outward. This solves the race condition error that would lead to missing pixels on some images.
|
||||||
|
Eliminate needless variables and make every effort to get the kernel as compact as possible. This allows running a block size of 32x32.
|
||||||
|
Rename blockHistCol and blockHistRow to threadHistCol and threadHistRow since that's what they are.
|
||||||
|
In CreateGaussianDEKernel(), have the last row accumulate since it's slightly faster than having the first row do it.
|
||||||
|
In CreateGaussianDEKernel(), Change the local buffer to be size 3000.
|
||||||
|
|
||||||
|
|
||||||
|
0.3.1.0 Beta 01/06/2014
|
||||||
|
--User Changes
|
||||||
|
Changing size when dragging in an image (orig -> window), resizing (window -> window), or doing a final render (window -> final render) now compensates for scale (pixels per unit).
|
||||||
|
Spatial filter width now allows values >= 0 and defaults to 0.4.
|
||||||
|
All spinners now scroll by the normal step / 10 when holding shift. Variation spinners are a special case and scroll by 0.001 with shift held down.
|
||||||
|
Final render now shows pure render time along with total time.
|
||||||
|
Fix bug in final render dialog where only the first image in the file would get rendered.
|
||||||
|
Installer will now uninstall the previous version automatically.
|
||||||
|
Installer now includes this file.
|
||||||
|
About box now fully specifies version with 4 digits.
|
||||||
|
|
||||||
|
--Code Changes
|
||||||
|
-Ember
|
||||||
|
Add function SetSizeAndAdjustScale() to adjust the scale for a size change.
|
||||||
|
|
||||||
|
-RendererCL
|
||||||
|
Report error when adding spatial filter params fails, which can happen when GPU memory runs out.
|
||||||
|
|
||||||
|
-DoubleSpinBox
|
||||||
|
Add m_Step and m_SmallStep members to specify how much to scroll by based on the keyboard modifier.
|
||||||
|
|
||||||
|
-FinalRenderEmberController
|
||||||
|
Add m_TotalTimer member to differentiate between render time and total time.
|
||||||
|
|
||||||
|
|
||||||
|
0.3 Beta 12/27/2013
|
||||||
|
--User Changes
|
||||||
|
Support for single and double precision data types in Fractorium.
|
||||||
|
Support for single and double precision data types with OpenCL.
|
||||||
|
Support for --nstrips on the command line with OpenCL.
|
||||||
|
Support for --lock_accum on the command line.
|
||||||
|
Fix memory errors.
|
||||||
|
Fix affine circle selection bugs.
|
||||||
|
|
||||||
|
--Code Changes
|
||||||
|
Provide templated copy constructors and assignment operators for:
|
||||||
|
-Affine2D
|
||||||
|
-CarToRas
|
||||||
|
-Color
|
||||||
|
-Ember
|
||||||
|
-Palette
|
||||||
|
-Point
|
||||||
|
-Variation
|
||||||
|
|
||||||
|
-CarToRas
|
||||||
|
More clearly name raster bounds member variables.
|
||||||
|
|
||||||
|
-DensityFilter
|
||||||
|
Make a non-templated base with a single virtual function.
|
||||||
|
Make ToString() and other member functions const.
|
||||||
|
|
||||||
|
-Ember.cpp
|
||||||
|
Better export defines for single and double template classes.
|
||||||
|
Only export double template classes with the same type, no more type mixing.
|
||||||
|
|
||||||
|
-Ember.h
|
||||||
|
Add EqualizeWeights() function.
|
||||||
|
Replace INTERP macros with templated function that take member variable addresses as template parameters.
|
||||||
|
Supply proper template type for some mat2x3 objects in Interpolate().
|
||||||
|
Make TotalXformCount() const like XformCount().
|
||||||
|
Make CompareEmbers() static function conform to new std comparison signature, taking two references and returning a bool.
|
||||||
|
Make ToString() const.
|
||||||
|
|
||||||
|
EmberDefines.h
|
||||||
|
Explicitly specify types for all enums.
|
||||||
|
|
||||||
|
Isaac.h
|
||||||
|
Improve code style.
|
||||||
|
|
||||||
|
Palette.h
|
||||||
|
Require template argument for newRgb parameter in CalcNewRgb() to support copying to pixels of a different type (float to double, or double to float).
|
||||||
|
|
||||||
|
Renderer.h/cpp
|
||||||
|
Derive Renderer<T, bucketT> from a non-templated based named RendererBase.
|
||||||
|
Add virtual function MakeDmap() which creates the scaled, final palette to use so that RendererCL can override it to specifically use a float palette at all times.
|
||||||
|
Check results of AccumulatorToFinalImage() instead of blindly assuming it succeeded.
|
||||||
|
Add virtual function Callback() to set the callback object.
|
||||||
|
Fix bug in ogScaleDensityFilter() which was causing the last line not to be filtered by starting at the gutter width offset. Filter all pixels now.
|
||||||
|
Properly template temporary bucket objects in GaussianDensityFilter(), AccumulatorToFinalImage(), Accumulate(), AddToAccum() and GammaCorrection().
|
||||||
|
Fix bug in Iterate() where the returned iter count was junk due to overflow. Use unsigned __int64 for everything, including literals with the ULL suffix.
|
||||||
|
Properly template m_Dmap and m_AccumulatorBuckets members.
|
||||||
|
Add virtual MemoryAvailable() function to return how much memory is available on the CPU, or on the GPU in derived classes.
|
||||||
|
|
||||||
|
SheepTools.h
|
||||||
|
Allow it to take two template parameters to pass to the internal renderer.
|
||||||
|
|
||||||
|
SpatialFilter.h
|
||||||
|
Make ToString(), Filter() and other member functions const.
|
||||||
|
|
||||||
|
TemporalFilter.h
|
||||||
|
Make ToString() and other member functions const.
|
||||||
|
|
||||||
|
Utils.h
|
||||||
|
Add global static function CopyVec() to copy a vector of one type to another.
|
||||||
|
Add global static function RgbaToRgb() to copy an RGBA buffer to an RGB one.
|
||||||
|
Add global static function ClampGte0Ref() as a thin wrapper.
|
||||||
|
|
||||||
|
Variation.h
|
||||||
|
Supply templated copy constructors to support creating copies of variations using different types.
|
||||||
|
Use initializer in Variation constructor for m_Name to avoid unnecessary string constructor call.
|
||||||
|
Make ToString() const.
|
||||||
|
Add two new virtual functions to all variations to make a copy of themselves using a different type and placing the new object in a reference to a pointer passed in.
|
||||||
|
Add ParentXform() function.
|
||||||
|
Rename SetParentXform() to ParentXform().
|
||||||
|
Use real_t instead of float to support double in OpenCL.
|
||||||
|
|
||||||
|
-Xform.h
|
||||||
|
Rename m_Density member to m_Weight.
|
||||||
|
Make ToString() and other member functions const.
|
||||||
|
|
||||||
|
|
||||||
|
EmberRender, EmberAnimate, EmberGenome:
|
||||||
|
Take two template arguments to pass to renderer.
|
||||||
|
Better handling of erroneous arguments for bits per channel and thread count when using OpenCL.
|
||||||
|
Use proper std::sort() comparison function.
|
||||||
|
Support saving as 3 channel image, such as bmp or jpg when using 4 channels with OpenCL.
|
||||||
|
Add --lock_accum option.
|
||||||
|
Add full double precision support for OpenCL.
|
||||||
|
Add support for --nstrips when using OpenCL.
|
||||||
|
Ensure strips divide evenly into the final raster image height.
|
||||||
|
Move CalcStrips() out of EmberEnder.cpp and into EmberCommon.h.
|
||||||
|
Dump errors if anything went wrong while rendering.
|
||||||
|
|
||||||
|
EmberCL
|
||||||
|
Template all kernel creators to support float and double.
|
||||||
|
|
||||||
|
DEOpenCLKernelCreator.h/cpp
|
||||||
|
Put global barrier on all accum writes.
|
||||||
|
Only use no-cache version when using double.
|
||||||
|
|
||||||
|
EmberCLFunctions.h
|
||||||
|
Support double, including when doing atomics using ulong for the int part of the unions.
|
||||||
|
|
||||||
|
EmberCLStructs.h
|
||||||
|
Template all CL structures.
|
||||||
|
Remove m_MinRad and m_MaxRad from DensityFilterCL since they are never used.
|
||||||
|
|
||||||
|
FinalAccumOpenCLKernelCreator.h/cpp
|
||||||
|
Template all.
|
||||||
|
|
||||||
|
IterOpenCLKernelCreator.h/cpp
|
||||||
|
Template all.
|
||||||
|
Fix glaring bug in zeroize kernel that was writing past the end of memory. Most likely the source of previous crashes.
|
||||||
|
|
||||||
|
OpenCLWrapper.h/cpp
|
||||||
|
Add support for double.
|
||||||
|
|
||||||
|
RendererCL.h/cpp
|
||||||
|
Template to support double.
|
||||||
|
Use cached color values m_ColorSpeedCache and m_OneMinusColorCache instead of m_Density and m_ColorX.
|
||||||
|
In RunDensityFilter(), reduce the block size by 2 when running with double, else the GPU runs out of resources.
|
||||||
|
|
||||||
|
Fractorium.h/cpp
|
||||||
|
Complete rework to a controller architecture to move the processing code out of the GUI and to support templating.
|
||||||
|
|
||||||
|
|
||||||
|
0.2 Beta 11/2013
|
||||||
|
-Minor fixes.
|
||||||
|
-Install to Program Data to avoid admin privileges errors.
|
||||||
|
|
||||||
|
|
||||||
|
0.1 Beta 11/2013
|
||||||
|
-Initial release.
|
26
Data/Wiki/AboutDialog.htm
Normal file
26
Data/Wiki/AboutDialog.htm
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#summary About dialog
|
||||||
|
<font face="Verdana">
|
||||||
|
|
||||||
|
=About=
|
||||||
|
|
||||||
|
The About dialog shows miscellaneous program information.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
==Code Copied==
|
||||||
|
|
||||||
|
This is code where portions were copied and modified.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Libraries Linked==
|
||||||
|
|
||||||
|
This is code that was either directly copied and remained mostly unmodified, or was built and linked in library form.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Icons Used==
|
||||||
|
|
||||||
|
The various icon sets that Fractorium got its icons from. Almost all of these were altered to be gray.
|
||||||
|
</li>
|
||||||
|
</ul>
|
318
Data/Wiki/AlgorithmExplanation.htm
Normal file
318
Data/Wiki/AlgorithmExplanation.htm
Normal file
@ -0,0 +1,318 @@
|
|||||||
|
#summary How the fractal flames algorithm actually works.
|
||||||
|
<font face="Verdana">
|
||||||
|
|
||||||
|
=Introduction=
|
||||||
|
|
||||||
|
The standard way of getting familiar with the algorithm is reading the paper by Scott Draves and Erik Reckase, titled <a href="http://flam3.com/flame_draves.pdf">The Fractal Flame Algorithm</a>. Reading it is highly recommended before proceeding.
|
||||||
|
|
||||||
|
Another paper which gives more detail, and which this project borrows heavily from is the <a href="http://www.eecs.ucf.edu/seniordesign/su2011fa2011/g12/report.pdf">Cuburn paper</a>. The first few sections give a better description of the algorithm. The later sections are more focused on GPU implementations, so they are only recommended for advanced readers.
|
||||||
|
|
||||||
|
While the original paper gives a great introduction, it omits some important details. If one reads the flam3 code, they will notice that quite a bit is left out of the paper. This section of the wiki gives a detailed description of what actually happens when a fractal flame is rendered.
|
||||||
|
|
||||||
|
It's broken down into the data used, and the processing performed on the data in order from start to finish. It dispenses with mathematical terms and notation, and expresses the process in plain English with pseudo code.
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
=Details=
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
==Data==
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
===Buffers===
|
||||||
|
|
||||||
|
-Histogram: Supersampled with gutter, iteration is plotted here.
|
||||||
|
|
||||||
|
-Density filter buffer/accumulator: Same dimensions as histogram, density filter output written here.
|
||||||
|
|
||||||
|
-Final image buffer: Not supersampled, final output written here.<br></br>
|
||||||
|
|
||||||
|
The dimensions of the final image are straightforward. They are just the values specified in the size field of the Xml.
|
||||||
|
|
||||||
|
The dimensions of the histogram are slightly more complex to calculate:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
histwidth = (finalwidth * supersample) + (2 * gutter)
|
||||||
|
histheight = (finalheight * supersample) + (2 * gutter)
|
||||||
|
}}}
|
||||||
|
|
||||||
|
The gutter is to account for the extra space needed when filtering at edge pixels. It's calculated by:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
gutter = max((spatialfilterwidth - supersample) / 2, maxdensityfilterradius * supersample)
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Computing the histogram bounds (camera) is much more complex. The values are based off of the following Xml fields: size, supersample, scale, zoom, center, spatial and density filter widths.
|
||||||
|
|
||||||
|
Scale is the pixels per unit, meaning the number of raster pixels needed to represent the distance from 0 to 1 in the Cartesian plane. The higher the value, the more zoomed in the camera is. Increasing scale will degrade image quality.
|
||||||
|
|
||||||
|
Zoom is the amount of zoom to apply to the image. It has a similar effect to increasing scale, but does not suffer from quality loss. This will increase the number of iterations done to compensate.
|
||||||
|
|
||||||
|
Supersample is the value to multiply the dimensions of the histogram and accumulator by to accomplish anti-aliasing.
|
||||||
|
|
||||||
|
Center is the camera offset in on each axis. The image will move in the opposite direction of these values.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
===Fractal Flame (Ember)===
|
||||||
|
|
||||||
|
The main data structure is the fractal flame itself. In this project, it is referred to as an `Ember`.
|
||||||
|
|
||||||
|
An `Ember` contains the following pieces:<br></br>
|
||||||
|
-Dimensions, filter parameters, and quality settings.<br></br>
|
||||||
|
-A list of xforms, which each contain a weight, color index, color speed, pre and post affine transforms, and a list of variations.<br></br>
|
||||||
|
-A color palette.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
===Xml===
|
||||||
|
|
||||||
|
An `Ember` is stored in an Xml file, which can contain one or more `Embers` in them. The first step in rendering is to read the data out of the Xml and into a vector of `Embers`.
|
||||||
|
|
||||||
|
The first parameters encountered in each `Ember` are ones that specify general information about what is to be rendered, such as the dimensions, rotation, quality, supersampling, filter types and sizes, and color information. The colors that are to be used during iteration are specified in a palette, which is a list of 256 colors.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
===Palettes===
|
||||||
|
|
||||||
|
Palettes can be specified in one of two ways: An index into a palette file, or as an inserted block of data present in the `Ember` Xml. For the first case, the palette file is usually the standard flam3-palettes.xml file which contains 700 palettes and is shipped with all fractal flame editors. The `Ember` has an Xml field named palette whose value is an integer index into the file. A value of -1 means to select a random palette from the file. The palette index field is used in conjunction with the hue field. Hue signifies a hue rotation to be applied to the palette after it's read. The palettes in the file are stored as RGB values in the range of 0-255. Upon reading, the hue rotation is applied to them, and they are converted into normalized values ranging from 0-1. They are stored with the `Ember` in a `Palette` object.
|
||||||
|
|
||||||
|
The other way of specifying a palette is to embed it directly in the Xml as either individual tags for each color entry, or as a hexadecimal representation of the binary data. The latter is preferred because it keeps the Xml files smaller. When embedding the palette, no hue adjustment is applied after reading it.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
===Xforms===
|
||||||
|
|
||||||
|
The xforms are what contribute most to defining the look of the final output image. Each xform contains several parameters:
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
====Weight====
|
||||||
|
|
||||||
|
The probability that the xform will be chosen in each iteration. All weights are normalized before running.
|
||||||
|
</li><li>
|
||||||
|
====Color Index====
|
||||||
|
|
||||||
|
The index in the palette the xform uses.
|
||||||
|
</li><li>
|
||||||
|
====Color Speed====
|
||||||
|
|
||||||
|
The speed with which the color indices are pulled toward this xform's color index. This value can be negative.
|
||||||
|
</li><li>
|
||||||
|
====Opacity====
|
||||||
|
|
||||||
|
How visible the xform's contribution to the image is.
|
||||||
|
</li><li>
|
||||||
|
====Pre Affine Transform====
|
||||||
|
|
||||||
|
The affine transform that is applied to the input coordinates which will be used as inputs to the variations.
|
||||||
|
</li><li>
|
||||||
|
====Post Affine Transform====
|
||||||
|
|
||||||
|
The affine transform that is applied to the output of the sum of the variations, optionally omitted.
|
||||||
|
</li><li>
|
||||||
|
====Variations====
|
||||||
|
|
||||||
|
A list of functions which each contain a weight, and optionally more parameters.
|
||||||
|
</li><li>
|
||||||
|
====Xaos====
|
||||||
|
|
||||||
|
Xaos is an optional advanced feature that adds an element of control to the random selection of xforms during iteration. It adds an adjustment to the probability that a given xform will be selected based on the xform that was selected in the previous iteration. This is usually omitted.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
In addition to the list of xforms, an additional one can be specified as the final xform. It contains all of the same parameters, except weight. This is because it is always applied in each iteration.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Filters===
|
||||||
|
|
||||||
|
As mentioned earlier, each `Ember` contains filtering parameters. These are values used to specify details about the three filtering stages used to improve the quality of the final output image. They are:
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
====Temporal====
|
||||||
|
|
||||||
|
In addition to creating a still image, the algorithm can be used to create a series of still images where each represents a frame in an animation. This is done by adjusting the affine transforms slightly for each frame. It also involves interpolating (blending) between two different `Embers`. Sometimes, even slight changes in the `Ember` parameters can cause a large change in the final output image. To mitigate this effect, each frame splits its render into a number of temporal samples. This does not increase the number of iterations. Instead, it breaks the total number of iterations into chunks. Each chunk renders an interpolated `Ember` at a specific time between the current frame and the next one to be rendered. The histogram is not cleared between temporal samples, so all iteration values are accumulated to produce a motion blurring effect. A temporal samples value of 1000 is commonly used for animation. When rendering a single frame, the number of temporal samples is always set to 1 since there is nothing to interpolate.
|
||||||
|
</li><li>
|
||||||
|
====Density====
|
||||||
|
|
||||||
|
Flam3 refers to this as density estimation, or DE. This is a misnaming as there is no estimation taking place. Rather, a variable width Gaussian filter is applied to each log scaled histogram cell. The Xml specifies the minimum and maximum widths that the filter can be, as well as the decay curve for how quickly the filter's values drop off when extending outward from the pixel being filtered.
|
||||||
|
</li><li>
|
||||||
|
====Spatial====
|
||||||
|
|
||||||
|
After iterating and density filtering are done, final color correction to the output image is computed. Spatial filtering is applied during this step. The Xml parameters specify both the width of the filter as well as the type. This gives very fine adjustment over what the final image looks like.
|
||||||
|
<br></br>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
==Processing==
|
||||||
|
|
||||||
|
The process contains 3 main steps:
|
||||||
|
|
||||||
|
-Iterating<br></br>
|
||||||
|
-Density Filtering<br></br>
|
||||||
|
-Final Accumulation
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
===Iterating===
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
====Xform Application====
|
||||||
|
|
||||||
|
Iterating is described in the paper, however it's worth clarifying because it's the most important part of the algorithm.
|
||||||
|
|
||||||
|
Random numbers are obviously a core component of the algorithm, however the paper doesn't touch on exactly how they're implemented and used. Flam3 uses a very fast and high quality RNG named ISAAC because system RNGs are usually of poor quality. Using ISAAC also allows for producing the exact same image on different platforms when supplied with the same seed.
|
||||||
|
|
||||||
|
More interesting though, is how the numbers from ISAAC are used to select random xforms. Before iterating begins, a buffer of 10,000 elements is created. All xform weights are normalized and the elements of the buffer are populated with xform indices with a distribution proportional to each of their weights. For example, given an Ember with 4 xforms, each with a weight of 1, their normalized weights would each become 0.25. The random selection buffer would then be populated like so:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
buf[0..2499] = 0
|
||||||
|
buf[2500..4999] = 1
|
||||||
|
buf[5000..7499] = 2
|
||||||
|
buf[7500..9999] = 3
|
||||||
|
}}}
|
||||||
|
|
||||||
|
To select a random xform, retrieve the next random unsigned integer from ISAAC and perform a modulo (%) 10,000. The value at that index in the buffer is the index of the next xform to use.<br></br>
|
||||||
|
|
||||||
|
The classic Iterated Function System works like the following pseudo code in flam3 and Ember:
|
||||||
|
|
||||||
|
x and y = random numbers between -1 and 1.
|
||||||
|
|
||||||
|
Pick a random xform from the Ember, with biases specified by their weights.
|
||||||
|
|
||||||
|
Calculate tx and ty by applying the selected xform's pre affine transform to x and y:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
tx = Ax * By + C
|
||||||
|
ty = Dx * Ey + F
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Pass the transformed point to each of the variations and sum the results. Note that this does not change the transformed points at all, they are only used as inputs.
|
||||||
|
|
||||||
|
{{{
|
||||||
|
vx = 0
|
||||||
|
vy = 0
|
||||||
|
|
||||||
|
vx,vy += var1(tx, ty)
|
||||||
|
vx,vy += var2(tx, ty)
|
||||||
|
vx,vy += var3(tx, ty)
|
||||||
|
...
|
||||||
|
vx,vy += varN(tx, ty)
|
||||||
|
|
||||||
|
ox, oy = vx, vy
|
||||||
|
}}}
|
||||||
|
|
||||||
|
If a post affine transform is present, apply it to the result calculated from summing the outputs of the variations above.
|
||||||
|
|
||||||
|
{{{
|
||||||
|
ox = pAvx * pBvy + pC
|
||||||
|
oy = pDvx * pEvy + pF
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Now that the new point has been calculated, compute the new color coordinate. As the paper states, the coordinate is the one specified in the currently chosen xform, blended with the one from the previously chosen xform. It incorrectly states that blending is achieved by adding the current and previous coordinates and dividing by 2. Not only is it calculated differently, but the hard coded value of 2 is actually the user specified color speed parameter of each xform. The real calculation is:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
newindex = colorspeed * thisindex + (1.0 - colorspeed) * oldindex
|
||||||
|
}}}
|
||||||
|
|
||||||
|
It's important to note that the colors themselves are not being blended, only their indices in the palette are.
|
||||||
|
|
||||||
|
At this point, we have the final output point ox,oy to be plotted to the histogram. However, we can't use it just yet. There is a slight possibility that the calculated value was not valid. This is detected by checking for it being very close to infinity, or very close to zero. If either are the case, 5 attempts at the following correction method are tried:
|
||||||
|
|
||||||
|
-Pick a new input point with x and y each being a different random number between -1 and 1.<br></br>
|
||||||
|
-Pick a new random xform and apply it.<br></br>
|
||||||
|
-Keep color index from the first xform that was applied, which originally gave us the bad values.<br></br>
|
||||||
|
|
||||||
|
If after 5 attempts, a valid point is not produced, the output point is assigned random numbers between -1 and 1. The number of bad values are saved for statistical use later.
|
||||||
|
|
||||||
|
After computing this point, apply a final xform if one is present. Plot its output next, however do not feed it back into the iteration loop. Rather, only feed the output of the randomly selected xform above to the next iteration of the loop.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
====Plotting====
|
||||||
|
|
||||||
|
Once we have our new point, it's time to plot it. This is one of the most important parts of the algorithm, so it's worth detailing what exactly happens. First, let's review the information the point contains:
|
||||||
|
|
||||||
|
-An x,y coordinate in Cartesian space.<br></br>
|
||||||
|
-A color index from 0-255.<br></br>
|
||||||
|
|
||||||
|
The first step in plotting is applying any rotation specified in the Xml. Rotation is specified in terms of the camera, so it will actually rotate the image in the opposite direction.
|
||||||
|
|
||||||
|
After applying rotation to the coordinate, bounds checking is done. If the point is outside of the Cartesian space the histogram covers, then it's discarded, otherwise it's plotted if the opacity is non-zero.
|
||||||
|
|
||||||
|
The point can't be plotted directly because it's in a different coordinate system than the one used for indexing the histogram memory. The points are decimal numbers in Cartesian space with 0,0 at the center. The histogram is stored in raster coordinates with 0,0 at the top left and each bucket specified by an integer x,y index. So before plotting, the coordinates must be converted to determine the histogram bucket to write to.
|
||||||
|
|
||||||
|
After computing the raster coordinate, a color must be added to the bucket. This is gotten from the Ember's color palette, at the index specified in the point. A similar coordinate problem occurs in that the computed color index is a decimal number, but the indices in the palette are integers. The algorithm offers two methods for retrieving the color. The first is called "Step" and just rounds the index down to the nearest integer. The other is called "Linear" and does a blending of the values at the integer index and the one next to it.
|
||||||
|
|
||||||
|
Once a color is retrieved, multiply all three RBG values by the opacity and add the result to the RGB values in the histogram bucket at the specified location. The alpha channel is unused for transparency and is instead used as a hit counter to record how many times a given bucket was hit during iteration. Each hit adds one to the alpha channel.
|
||||||
|
|
||||||
|
The Cartesian coordinate calculated from applying the xform in the previous step is fed back into the iteration loop and is used as the starting point for repeating the process all over again. The number of times this is done is referred to as the quality and is equal to:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
quality * finalwidth * finalheight
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Note that while supersampling increases the size of the histogram, it does not increase the number of iterations performed.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
====Trajectory====
|
||||||
|
|
||||||
|
Iterating and plotting don't occur exactly in the order described above or in the paper. The point is not plotted immediately after each xform application. Rather, the points are all stored in a temporary buffer whose size defaults to 10,000, known as a sub batch. Once 10,000 iterations have completed, all of the points are plotted to the histogram. Before the next sub batch begins, the point trajectory is reset by re-enabling the fuse state and assigning the first input coordinate random numbers between -1 and 1.
|
||||||
|
|
||||||
|
This method of using sub batches reveals an interesting characteristic of the algorithm not covered in the paper. That is, the point trajectory need not remain continuous to produce a final image. Even when resetting every 10,000 iterations, the trajectory still converges on the attractor. Thanks to this property, multi-threading does not degrade the image quality by breaking up the trajectory, since each thread will run many sub batches.<br></br>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
===Density Filtering===
|
||||||
|
|
||||||
|
After the iteration loop is performed many times, most of the buckets in the histogram will have been hit many times. This puts their color values far outside the allowed range for display, 0-255 (or 0-1 for normalized colors).
|
||||||
|
|
||||||
|
To bring these color values into the valid range, log scaling is applied. There are two types, basic log scaling or log scaling with density estimation filtering. As stated above, the term density estimation is misleading, since no estimating of any kind takes place.
|
||||||
|
|
||||||
|
Basic log scaling is triggered by setting the maximum density filtering radius to zero. It is achieved by performing the following step on each histogram bucket:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
scale = 2^zoom
|
||||||
|
scaledquality = quality * scale * scale
|
||||||
|
area = (finalwidth * finalheight) / (pixelsperunitx * pixelsperunity)
|
||||||
|
k1 = (brightness * 268) / 256
|
||||||
|
k2 = supersample^2 / (area * scaledquality * temporalfilter.sumfilt)
|
||||||
|
accumulator[index] = (k1 * log(1 + histogram[index].hitcount * k2)) / histogram[index].hitcount
|
||||||
|
}}}
|
||||||
|
|
||||||
|
This calculation is much more complex than the simplistic log(a)/a mentioned in the flam3 paper. Note the presence of the somewhat mysterious k1 and k2 variables. They are mentioned nowhere in the paper, and are completely undocumented in the flam3 code, yet play a large role in how the final output image appears. k1 is intended to be the brightness multiplied by a magic number. k2 helps adjust the log scaling based on the supersample.
|
||||||
|
|
||||||
|
If the max density filtering radius is greater than zero, a much more advanced algorithm is used for filtering. As stated in the paper, it's a Gaussian blur filter whose width is inversely proportional to the number of hits in a given bucket. This means that buckets which were hit infrequently will have a wide blur applied to the surrounding pixels. A bucket with many hits will have very little blur applied.
|
||||||
|
|
||||||
|
The result of these filtering operations is written to another buffer of identical size called the filtering buffer, or accumulator.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
===Final Accumulation===
|
||||||
|
|
||||||
|
Despite filtering, the image is still not ready for final display. One more step is needed, and that is final accumulation with spatial filtering.
|
||||||
|
|
||||||
|
For each pixel in the filtering buffer at the beginning (top left) of each supersample block (SSxSS), a spatial filter is applied and the resulting value is written as a single pixel to the final output image.
|
||||||
|
|
||||||
|
The spatial filter is of a fixed width and type specified in the original Xml. It multiplies the filter values by the pixel values of all pixels extending forward and down by the length of the filter, and sums them to a final value. This final value will most likely be out of range, so further color correction is necessary. Gamma correction is applied and the final pixels are clamped to the valid range of 0-255 and written to the output image buffer. Note that the color correction process is not documented anywhere and remains mostly a mystery, however it works.
|
||||||
|
|
||||||
|
If early clipping is specified, the color correction is applied before the spatial filter.
|
||||||
|
|
||||||
|
The process is done.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
232
Data/Wiki/Building.htm
Normal file
232
Data/Wiki/Building.htm
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
#summary How to build Fractorium from source.
|
||||||
|
<font face="Verdana">
|
||||||
|
|
||||||
|
=Introduction=
|
||||||
|
|
||||||
|
Step by step instructions for building Fractorium and its associated libraries from source.
|
||||||
|
|
||||||
|
The development environment currently supported is Visual Studio 2010 SP1. In the future, other compilers and operating systems will be supported. For now, this page focuses on VS 2010 SP1.
|
||||||
|
|
||||||
|
First install Visual Studio 2010, and run it once. Then close it and install SP1.
|
||||||
|
|
||||||
|
=Details=
|
||||||
|
|
||||||
|
The release built into the installer on the main page is for x64 systems only. This is because x64 gives a ~30% performance improvement over x86, which is most likely due to additional registers in the x64 standard. Another reason for x64 only, is that such processors have been around for almost a decade, with popular operating system support existing since Windows Vista. There is simply no reason to support x86 systems. This project aims to help move the target platforms of popular applications away from x86 and toward x64.
|
||||||
|
|
||||||
|
Sadly, the free version of Visual Studio does not support building x64 targets. You are welcome to build for x86, but understand that the CPU performance will be significantly lower than what you experience with the executable contained in the installer.
|
||||||
|
|
||||||
|
These steps must be followed exactly as stated, and in the order stated. Skipping any step, or doing any step out of order will break the build.
|
||||||
|
|
||||||
|
==Prerequisites==
|
||||||
|
|
||||||
|
These are the libraries that the project depends on. Download the zip files and extract them into folders organized in the following way:
|
||||||
|
|
||||||
|
/<a href="http://sourceforge.net/projects/ogl-math/">glm</a> (Matrix math)<br></br>
|
||||||
|
/<a href="http://www.ijg.org/">libjpeg</a> (Jpg image support)<br></br>
|
||||||
|
/<a href="https://sourceforge.net/projects/libpng/files/">libpng</a> (Png image support)<br></br>
|
||||||
|
/<a href="https://git.gnome.org/browse/libxml2/">libxml2</a> (Xml parsing support)<br></br>
|
||||||
|
/<a href="https://www.threadingbuildingblocks.org/">tbb</a> (Intel Threading Building Blocks)<br></br>
|
||||||
|
/<a href="http://www.zlib.net/">zlib</a> (Zip compression)
|
||||||
|
|
||||||
|
===libjpeg===
|
||||||
|
|
||||||
|
libjpeg does not ship with VS 2010 projects, so its older project files must first be converted before opening the solution.
|
||||||
|
|
||||||
|
Open a Visual Studio command prompt and navigate to:
|
||||||
|
|
||||||
|
/libjpeg
|
||||||
|
|
||||||
|
and run:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
NMAKE /f makefile.vc setup-v10
|
||||||
|
}}}
|
||||||
|
|
||||||
|
This will create all of the necessary project files for libjpeg.
|
||||||
|
|
||||||
|
===libxml2===
|
||||||
|
|
||||||
|
The libxml2 project is crippled out of the box so it needs some changes before it will open. Further changes will be required later once it's opened.
|
||||||
|
|
||||||
|
Navigate to:
|
||||||
|
|
||||||
|
libxml2\win32
|
||||||
|
|
||||||
|
and find the file configure.js. Right click on it and click Properties. Ensure the default program used to open it is Windows Based Script Host, click Ok. Double click configure.js and you will see several message boxes telling you the project files it created.
|
||||||
|
|
||||||
|
===OpenCL===
|
||||||
|
|
||||||
|
Install the latest drivers for your video card.
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
====nVidia====
|
||||||
|
Install the latest <a href="https://developer.nvidia.com/cuda-downloads">CUDA</a> development kit, which will contain un-advertized OpenCL libraries.
|
||||||
|
|
||||||
|
Get the file <a href="http://www.khronos.org/registry/cl/api/1.1/cl.hpp">cl.hpp</a> and place it here:
|
||||||
|
|
||||||
|
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include\CL
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
====AMD====
|
||||||
|
Install the APP SDK.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
===Qt===
|
||||||
|
|
||||||
|
Qt is what Fractorium uses for its GUI. Sadly, the pre-compiled version of Qt cannot be used. Instead, it must be completely rebuilt from source. The reason being that it does not use the desktop OpenGL library and instead uses OpenGL ES. Since Qt is a very large build, you should only do this step if you plan to build the full Fractorium GUI. If you are only interested in the Ember libraries and command line programs, skip this step.
|
||||||
|
|
||||||
|
Further, Qt will not work with Express versions of Visual Studio.
|
||||||
|
|
||||||
|
These instructions roughly follow what's listed <a href="http://qt-project.org/wiki/Building-Qt-5-from-Git">here</a>, however they are a bit more concise.
|
||||||
|
|
||||||
|
Install the <a href="http://qt-project.org/downloads">Visual Studio Qt Add-on</a> found in the Other Downloads section of the Qt downloads page.
|
||||||
|
|
||||||
|
Install <a href="http://msysgit.github.io/">Git</a>, <a href="http://www.activestate.com/activeperl/downloads">Perl</a>, <a href="http://www.python.org/download/releases/">Python</a> and <a href="http://qt-project.org/wiki/jom">Jom</a>.
|
||||||
|
|
||||||
|
Assuming Jom was installed to C:\jom and Python was installed to C:\Python27, add both of these to your PATH variable:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
C:\jom
|
||||||
|
C:\Python27\DLLs
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Open a Visual Studio x64 command prompt and cd to the folder which contains all prerequisites and Fractorium. Enter the following commands:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
git clone git://gitorious.org/qt/qt5.git qt5
|
||||||
|
cd qt5
|
||||||
|
git checkout stable
|
||||||
|
}}}
|
||||||
|
|
||||||
|
This will take roughly 15 minutes. After it's done, add these paths to your PATH variable:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
/your/dev/dir/qt5/qtbase/bin
|
||||||
|
/your/dev/dir/qt5/gnuwin32/bin
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Add these environment variables:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
QMAKESPEC win32-msvc2010
|
||||||
|
QTDIR /your/dev/dir/qt5/qtbase
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Enter the following commands to configure and build:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
Perl init-repository –no-webkit
|
||||||
|
cd qtbase
|
||||||
|
configure -developer-build -opensource -shared -opengl desktop -platform win32-msvc2010 -nomake examples -nomake tests
|
||||||
|
jom.exe
|
||||||
|
}}}
|
||||||
|
|
||||||
|
The jom.exe command is what actually starts the build. Note that you should replace the number 4 with the number of cores on your system. Configuring and building will take roughly one hour.
|
||||||
|
|
||||||
|
Once finished, open Visual Studio and verify there is a menu item named Qt5. Click on it and click Qt Options.
|
||||||
|
|
||||||
|
Add a new Qt version to the list with the exact name of "5.0.1", and set its path to /your/dev/dir/qt5/qtbase
|
||||||
|
|
||||||
|
The name must match exactly and must be created before any Qt solution is opened. If not, the Qt add-in will completely ruin all solution and project files that use Qt.
|
||||||
|
|
||||||
|
Set the default version to the newly created Qt version and click Ok.
|
||||||
|
|
||||||
|
===Fractorium===
|
||||||
|
|
||||||
|
Next, checkout Fractorium with cvs so that it's on the same level with the other dependencies like so:
|
||||||
|
|
||||||
|
/<a href="https://code.google.com/p/fractorium/source/checkout">fractorium</a>
|
||||||
|
|
||||||
|
/glm
|
||||||
|
|
||||||
|
/libjpeg
|
||||||
|
|
||||||
|
/libpng
|
||||||
|
|
||||||
|
/libxml2
|
||||||
|
|
||||||
|
/qt5
|
||||||
|
|
||||||
|
/tbb
|
||||||
|
|
||||||
|
/zlib
|
||||||
|
|
||||||
|
To build the installer, you must have <a href="http://wixtoolset.org/">Wix</a> installed. If you are unconcerned with it, you can skip this step and just dismiss the warning that shows when opening the solution later.
|
||||||
|
|
||||||
|
==Opening the Solution==
|
||||||
|
Navigate to the subfolder:
|
||||||
|
|
||||||
|
fractorium/Builds/MSVC/VS2010
|
||||||
|
|
||||||
|
and open Fractorium.sln
|
||||||
|
|
||||||
|
If all dependencies were placed in the proper hierarchy, the solution should open with no warnings or errors. However, it's not ready to build yet.
|
||||||
|
|
||||||
|
==Build Configuration==
|
||||||
|
|
||||||
|
Visual Studio merges all build configurations and platforms from every project in a solution. Because Fractorium has dependencies on other libraries, the configuration manager will show all configurations from all projects in the solution. Most of these can safely be ignored. The only configurations that matter are Debug/Release. The only platforms that matter are Win32/x64.
|
||||||
|
|
||||||
|
Building other configurations and platforms is not advised and is unsupported.
|
||||||
|
|
||||||
|
Despite x64 support in Visual Studio for many years, most third party libraries do not ship with an x64 build target in their project files. You must manually create them here before you can build for x64. If you are only building for Win32, you can skip this step.
|
||||||
|
|
||||||
|
Right click on the solution and open the Configuration Manager.
|
||||||
|
|
||||||
|
Set the configuration to Release, and the platform to x64. Do the following for jpeg, libpng, libxml2, pnglibconf, and zlib:
|
||||||
|
|
||||||
|
-Click the combo box in the platform column on the project's row and select New...
|
||||||
|
|
||||||
|
-Set New Platform to x64, and Copy Settings From to Win32. Click Ok. Note, Visual Studio has a bug where you may need to do this twice for each project. After you click Ok, click the combo box again to verify it worked. If x64 is shown as a valid platform in the list, it worked. If not, you must repeat this step.
|
||||||
|
|
||||||
|
===Further libxml2 Changes===
|
||||||
|
|
||||||
|
Right click on the libxml2 project and open the properties dialog and click Configuration Properties.
|
||||||
|
|
||||||
|
Navigate to General, select all configurations and all platforms and set the configuration type to Dynamic Library (.dll).
|
||||||
|
|
||||||
|
Set Output Directory to:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
$(SolutionDir)$(Platform)\$(Configuration)\
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Set Intermediate Directory to:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
$(Platform)\$(Configuration)\
|
||||||
|
}}}
|
||||||
|
|
||||||
|
and click Apply.
|
||||||
|
|
||||||
|
Navigate to C/C++ | General and make sure these paths are present in the Additional Include Directories for Debug/Release configurations and Win32/x64 platforms, and click Apply:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
$(ProjectDir);
|
||||||
|
$(ProjectDir)..\..\include;
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Navigate to C/C++ | Preprocessor, select All Configurations and All Platforms and add ;WIN32 to the list in Preprocessor Definitions, and click Apply.
|
||||||
|
|
||||||
|
Navigate to Linker | Input, select All Configurations and All Platforms and add ;Ws2_32.lib to the list of Additional Dependencies, and click Ok.
|
||||||
|
|
||||||
|
Find the file /include/libxml/xmlversion.h and comment out line 277:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
#define LIBXML_ICONV_ENABLED
|
||||||
|
}}}
|
||||||
|
|
||||||
|
because Fractorium doesn't need Iconv support.
|
||||||
|
|
||||||
|
===zlib Changes===
|
||||||
|
|
||||||
|
Open the file zutil.h, and comment out line 33:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
typedef long ptrdiff_t;
|
||||||
|
}}}
|
||||||
|
|
||||||
|
The solution is now ready to build. The output will be placed in:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
/your/dev/dir/fractorium/Bin/$(Platform)/$(Configuration)
|
||||||
|
}}}
|
15
Data/Wiki/CodingPhilosophy.htm
Normal file
15
Data/Wiki/CodingPhilosophy.htm
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#summary Coding philosophy.
|
||||||
|
<font face="Verdana">
|
||||||
|
|
||||||
|
=Introduction=
|
||||||
|
|
||||||
|
The philosophy behind the code contained in this project.
|
||||||
|
|
||||||
|
|
||||||
|
=Details=
|
||||||
|
|
||||||
|
Code is read many more times than it is written. Therefore, legible code is of high importance. This project makes every effort to write understandable, well designed and well documented code. When a person reads the code for the first time, they should not be blindsided with confusion. Instead, they should be able to navigate and understand the code and project structure relatively quickly.
|
||||||
|
|
||||||
|
Modern language techniques like lambdas, templates and the C++ Standard Template Library can greatly simplify code. These are taken advantage of at every possible opportunity. There is simply no valid reason to use legacy coding styles in a project of this nature.
|
||||||
|
|
||||||
|
This project only supports x64 hardware. Given the prevalence of it and operating systems that support it, as well as the performance boost it gives, there is no reason to continue supporting x86. Much like 16-bit programs have disappeared from the development landscape, 32-bit programs have also had their day.
|
29
Data/Wiki/CommandLinePrograms.htm
Normal file
29
Data/Wiki/CommandLinePrograms.htm
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#summary User's guide for command line programs.
|
||||||
|
<font face="Verdana">
|
||||||
|
|
||||||
|
=Introduction=
|
||||||
|
|
||||||
|
Usage of EmberRender, EmberAnimate and EmberGenome command line programs.
|
||||||
|
|
||||||
|
These are advanced tools mostly used in a scripted environment.
|
||||||
|
|
||||||
|
|
||||||
|
=Details=
|
||||||
|
|
||||||
|
These programs are replacements for the original flam3-render, flam3-animate and flam3-genome programs. They function the same and produce identical output, however they offer two major advantages over the originals:
|
||||||
|
|
||||||
|
-Option to use OpenCL renderer.<br>
|
||||||
|
-Ability to use command line arguments in addition to environment variables. The originals only supported the latter.<br>
|
||||||
|
|
||||||
|
Running any with the `--help` argument will provide a list of the options available to that program.
|
||||||
|
|
||||||
|
More information on the what these do and the options to pass them can be found in the original flam3 documentation here:
|
||||||
|
|
||||||
|
<a href="https://code.google.com/p/flam3/wiki/Flam3Render">EmberRender</a>
|
||||||
|
|
||||||
|
<a href="https://code.google.com/p/flam3/wiki/Flam3Animate">EmberAnimate</a>
|
||||||
|
|
||||||
|
<a href="https://code.google.com/p/flam3/wiki/Flam3Genome">EmberGenome</a>
|
||||||
|
|
||||||
|
|
||||||
|
The only option omitted was `field` which was used to render progressive scanned images for animations. Modern LCD/LED displays overcome the need for this.
|
9
Data/Wiki/Developers.htm
Normal file
9
Data/Wiki/Developers.htm
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#summary Information for developers.
|
||||||
|
|
||||||
|
[EmberImplementationDetails Ember]
|
||||||
|
|
||||||
|
[EmberCLImplementationDetails EmberCL]
|
||||||
|
|
||||||
|
[Building Building]
|
||||||
|
|
||||||
|
[CodingPhilosophy Coding Philosophy]
|
266
Data/Wiki/EmberCLImplementationDetails.htm
Normal file
266
Data/Wiki/EmberCLImplementationDetails.htm
Normal file
@ -0,0 +1,266 @@
|
|||||||
|
#summary EmberCL implementation details.
|
||||||
|
<font face="Verdana">
|
||||||
|
|
||||||
|
= Introduction =
|
||||||
|
|
||||||
|
EmberCL resides in a separate project that links to Ember and uses OpenCL to perform iteration, density filtering and final accumulation. Xml parsing, interpolation, and palette setup are still performed by the base library on the CPU.
|
||||||
|
|
||||||
|
OpenCL was chosen because it provides run-time compilation and cross platform interoperability, both of which nVidia's CUDA platform lack.
|
||||||
|
|
||||||
|
|
||||||
|
= Details =
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
==OpenCLWrapper==
|
||||||
|
|
||||||
|
OpenCL programming requires a large amount of setup code before getting to the point where a kernel can be invoked. To relieve the programmer of having to deal with such details, a class named `OpenCLWrapper` is provided. It holds all buffers, images, kernel source and compiled programs in memory and automatically frees them as necessary. Each object can be accessed via name string or index in a vector.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
==Kernel Creators==
|
||||||
|
|
||||||
|
At the heart of OpenCL is the kernel. It's a small program ran as the body of a number of threads executing in parallel. It takes the form of a text string that is compiled at run-time. The compiled binary output is passed to the device running OpenCL along with various arguments and grid dimensions. The grid is is a 1D, 2D or 3D matrix of blocks, and each block is a 1D, 2D or 3D matrix of threads. A full discussion of OpenCL is beyond the scope of this Wiki.
|
||||||
|
|
||||||
|
EmberCL takes a unique approach to building and running kernels for fractal flame rendering that differs from the other two major OpenCL implementations, flam4 and Fractron. The Single Instruction-Multiple Thread (SIMT) nature of the devices OpenCL runs on suffer from an interesting limitation that CPUs do not suffer from. CPUs are very good at processing conditionals, but are slower at doing calculations. SIMT devices are bad at processing conditionals, but are very fast at doing calculations. Because of this, the EmberCL kernel creators build special versions of kernels for each rendering processing step with the conditionals dynamically stripped out at runtime. This creates highly condensed kernels that only run what is absolutely necessary for the Ember currently being rendered. The drawback of this approach is that if the Ember currently being rendered differs enough from the previous one rendered, an OpenCL recompilation will be triggered. These take from one third to one half of a second on a modern processor.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
===Iteration Kernel===
|
||||||
|
|
||||||
|
The iteration kernel is the most advanced, and most important portion of the EmberCL library. It is here that EmberCL achieves its large performance lead over other OpenCL implementations of the fractal flame algorithm.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
====The Naive Implementation===
|
||||||
|
|
||||||
|
The naive implementation copies the code from the CPU implementation to a kernel and each thread runs it in parallel. This is very inefficient and is an improper use of OpenCL.
|
||||||
|
|
||||||
|
SIMT devices excel at executing the same instruction across multiple threads in a group. On nVidia hardware, this group is known as a warp and is 32 threads wide. On AMD hardware, it's known as a wavefront and is 64 threads wide. They operate at peak efficiency when every thread is executing the same instruction at once. If any threads take a different execution path than the others, then warp divergence occurs. Some threads have to sit idle and wait while others complete their operations until they can all get back in sync. This is a waste of resources and prevents the OpenCL device from achieving its full potential.
|
||||||
|
|
||||||
|
This scenario occurs with the naive implementation. If each thread is choosing random xforms to apply, then they will be diverging from all other threads which picked different xforms. A smarter implementation for randomization is needed when using OpenCL, enter cuburn.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
====Randomization Without Warp Divergence====
|
||||||
|
|
||||||
|
Cuburn was the senior project for 4 students at Central Florida University in the fall of 2011. It investigated this exact issue and came up with a novel solution using Python and CUDA. Their solution is implemented and improved on here in OpenCL and is what gives EmberCL its performance advantage. It takes the following form.
|
||||||
|
|
||||||
|
Each iteration block is 32 threads wide by 8 threads high, giving 256 threads. Each block gets a buffer of on-chip local shared memory with the same dimensions as the block (32x8) to store point iterations to.
|
||||||
|
|
||||||
|
For each iteration, instead of every thread picking a random xform to apply, each row of threads gets a single random xform and all threads in it execute the same xform. The output of each iteration is accumulated to the histogram and also written to a different thread's location within shared memory.
|
||||||
|
|
||||||
|
After each iteration, the process repeats by re-randomizing each row and having each thread use the point at its location in the shared memory buffer, which was the previous output of a different thread, as the input to the xform it applies. This process is repeated 256 times for each thread, giving a total of 65,536 iterations per block.
|
||||||
|
|
||||||
|
The combination of point shuffling and randomizing the xform each row applies on each iteration achieves the goal of eliminating warp divergence while also producing high quality randomization.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
====MWC vs ISAAC====
|
||||||
|
|
||||||
|
As mentioned in the Ember description, ISAAC is the RNG used in both Ember and flam3. While performing very well on the CPU, it's a poor choice for OpenCL since it would require a large amount of memory for each thread to keep its own copy. An alternative used in cuburn is the multiply-with-carry RNG. EmberCL uses this as well because it gives good randomization while requiring very little memory. Each block is passed a different seed, and each thread adds its index to the seed to ensure that all threads take a different trajectory when using the RNG.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
====Run-time Compilation====
|
||||||
|
|
||||||
|
As mentioned above, one of the key strengths of OpenCL is run-time compilation. EmberCL takes heavy advantage of this at every opportunity to achieve maximum performance. The CPU implementation has many conditional checks during iteration. These include the presence/absence of post affine transforms, final xforms, palette indexing mode, pre-blur variations as well as virtual functions (or a case statement in flam3) to execute each variation. Such a large number of conditionals would be detrimental to OpenCL performance. Run-time compilation allows us to eliminate these completely. Once the `Ember` to be rendered is known, the kernel to render it is dynamically generated with only the necessary parts included and is compiled on the fly.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
====Race Conditions====
|
||||||
|
|
||||||
|
One area where EmberCL differs from cuburn is that it does not account for the case of two threads accumulating to the same bucket in the histogram at the same time by default. Cuburn devoted a large portion of the paper to experimenting with every possible way to avoid such a condition. EmberCL ignores these efforts by default because they are mostly unnecessary. The whole point of using the GPU is to get real-time fractal flame rendering, or to make pre-rendered animations more quickly. With animating flames, a few pixels missing a few iteration values will be unnoticeable to the human eye. The small benefit of a clever implementation of such a mechanism is nowhere near being worth the performance hit and additional code complexity. However, is still interested in comparing the differences between locked and unlocked iteration, they can specify the `--lock_accum` argument on the command line for `EmberRender.exe` and `EmberAnimate.exe`. This will prevent race conditions, but will dramatically slow down the performance because the locking is achieved by using software atomic operations which are very slow.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
====Compatibility With CPU====
|
||||||
|
|
||||||
|
A concern with GPU implementations of any program originally written for a CPU is that it will not be able to implement every feature from the original. EmberCL addresses these concerns by implementing all other features involved with iteration which were originally implemented on the CPU. These are fusing, opacity, bad value detection, xaos, post affine transforms, final xforms, and step vs linear palette indexing for histogram accumulation.
|
||||||
|
<br></br>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Density Filter Kernel===
|
||||||
|
|
||||||
|
As mentioned in the algorithm overview description, density filtering can either be basic log scaling, or a more advanced Gaussian blur filter. EmberCL implements both of these. The former is trivial, the latter is very complex. The extreme difficulty of fully implementing density filtering such that it operates efficiently and also gives identical output to the CPU has prevented it from being done elsewhere. EmberCL overcomes this and is the first full implementation of variable width Gaussian density filtering for fractal flames in OpenCL. Seven different methods were tried, with the fastest being the chosen one. There are two main kernels used for density filtering, one with shared memory and one without.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
====Shared Memory Kernel====
|
||||||
|
|
||||||
|
The shared memory kernel is used for final filter widths of 9 or less with float data types due to the limited space of shared memory. As stated in the algorithm overview, density filtering multiplies the log scaled value at a given histogram bucket by a filter value and adds it to the surrounding pixels in the accumulator. This process repeats for the width of the filter and the scaling values decrease as it moves outward from the pixel being operated on.
|
||||||
|
|
||||||
|
When running on a GPU, these repeated reads and writes to global memory are very slow. A better approach is for each thread to read a pixel from the histogram, and perform filtering to a shared memory buffer. Once all threads in the block have finished, the final result from the shared memory box is written to the accumulator.
|
||||||
|
|
||||||
|
In the EmberCL implementation, each block is 32x32 threads, and the box size of the shared memory is the size of the block plus the width of the filter in each direction. So for the commonly used filter width of 9, the box size would be 32 + 9 x 32 + 9, or 41 x 41. Each block processes a box and exits. No column or row advancements take place.
|
||||||
|
|
||||||
|
The filter is applied in a different manner than on the CPU to avoid race conditions. On the CPU, it's applied from the center pixel outward. In OpenCL, it's applied by row from top to bottom.
|
||||||
|
|
||||||
|
Certain variables were reused because the code is so complex, the card runs out of resources for block sizes greater than 24.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
====Non-shared Memory Kernel====
|
||||||
|
|
||||||
|
The non-shared memory kernel is used for double precision data types or for final filter widths of 10 or more. This is commonly the case when supersampling is used because the final filter width is the supersample value times the max density filter radius. It takes roughly the same form as the shared memory kernel, but omits shared memory and deals directly with the histogram and accumulator for all reads and writes. Due to the excessive global memory accesses in this method, it offers no real performance improvement over the CPU.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
====Filter Overlapping====
|
||||||
|
|
||||||
|
Both of these methods present a problem when two kernels are operating on an adjacent block of pixels. Although the pixels themselves don't overlap, the filters extending out from the edges of the blocks do overlap. To overcome this, the kernels are launched in multiple passes that are spaced far enough apart vertically and horizontally on the image so as to not overlap.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
====Special Supersampling Cases====
|
||||||
|
|
||||||
|
Density filtering performs a few extra calculations depending on the supersample value used. To eliminate conditionals and achieve maximum performance, a separate kernel is built for each of these cases for the shared and non-shared memory cases. This leads to a total of 6 possible kernels being built to cover all scenarios. After being built once, the compiled output is saved for all subsequent renders during a program run.
|
||||||
|
<br></br>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
|
||||||
|
===Final Accumulation Kernel===
|
||||||
|
|
||||||
|
The implementation of final accumulation in OpenCL is the simplest of the kernels and is copied almost verbatim from the Ember CPU code. To maintain complete compatibility with the CPU, all advanced features such as transparency, early clipping and highlight power are implemented. Like density filtering, unnecessary calculations and conditionals are eliminated by providing different kernels depending on the parameters of the Ember being rendered. They are:
|
||||||
|
|
||||||
|
-Early clipping with transparency.<br></br>
|
||||||
|
-Early clipping without transparency.<br></br>
|
||||||
|
-Late clipping with transparency.<br></br>
|
||||||
|
-Late clipping without transparency.
|
||||||
|
|
||||||
|
All are assumed to have an alpha channel. Three channel RGB output is implemented, but not supported.
|
||||||
|
<br></br>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
|
||||||
|
==RendererCL==
|
||||||
|
|
||||||
|
The main rendering class in Ember is `Renderer`. EmberCL contains a class which derives from `Renderer<T>` named `RendererCL<T>` and fully supports both single and double precision data types like the base class does.
|
||||||
|
|
||||||
|
`RendererCL` overrides various virtual functions defined in `Renderer` and implements their processing on the GPU in OpenCL.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
===Shared vs. Un-shared===
|
||||||
|
|
||||||
|
`RendererCL` can operate in two modes, shared and un-shared.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
====Un-shared====
|
||||||
|
|
||||||
|
The final output is rendered to an OpenCL 2D image which no other running program is accessing.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
====Shared====
|
||||||
|
|
||||||
|
The final output is rendered to an OpenCL 2D image which another program is also using as an OpenGL 2D texture. This is how interactive rendering is done in the Fractorium GUI. Shared mode benefits from the efficiency of a shared image/texture because no copying is necessary and all outputs remain on the GPU.
|
||||||
|
For sharing to work, every call to create, access or destroy the output image must be preceded by a call to acquire the object from OpenGL and followed by a call to release it. These calls are handled internally by `OpenCLWrapper`.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
In either of these modes, the output image can be copied back into main memory as needed for use in writing the final output file.
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
===Parameter Differences===
|
||||||
|
|
||||||
|
A few user configurable properties from `Renderer` are hard coded in `RendererCL` due to how processing is implemented.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
====Thread Count====
|
||||||
|
|
||||||
|
Always considered to be 1, because threading is managed inside the kernels.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
====Channels====
|
||||||
|
|
||||||
|
Always 4 because the type of the output image is `CL_RGBA`. Final output file type can only be PNG.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
====Bits Per Pixel====
|
||||||
|
|
||||||
|
Always 8, 16bpp for PNG images is only supported in Ember on the CPU.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
====Sub Batch Size====
|
||||||
|
|
||||||
|
Always `iterblocksWide * iterblockshigh * 256 * 256` since that is the number of iterations performed in a single kernel call.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
===Kernel Launching===
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
====Iteration Grid Dimensions====
|
||||||
|
|
||||||
|
The iteration kernel is launched in a grid which is 64 blocks wide by 2 blocks high. Each block has 256 (32x8) threads which each perform 256 iterations. This gives 8,388,608 iterations per kernel launch. The grid dimensions were empirically derived and may change in the future as new hardware is released.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
====Passing Arguments====
|
||||||
|
|
||||||
|
An `Ember` object cannot be passed directly from the CPU side to an OpenCL kernel. Instead, stripped down versions of the `Ember` object and its filters are created and copied right before each kernel launch and are passed as arguments. However, the palette can be passed verbatim since it's just a 256 element `vector<vec4<float>>`.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
====Fusing====
|
||||||
|
|
||||||
|
Fusing is very important for image quality. Omitting it or choosing the wrong value will lead to strange artifacts in the final output image. Since there are so many threads, setting the fuse value is not as simple as just using the same value from the CPU side.
|
||||||
|
|
||||||
|
Forcing each thread to fuse on each kernel call would be a huge waste of resources since each only performs 256 iterations. On the other hand, not fusing often enough after several kernel calls leads to bad image quality. `RendererCL` uses an empirically derived solution of having every thread fuse 100 times for every 4 kernel calls, which is 1024 iterations.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
====Recompilation====
|
||||||
|
|
||||||
|
As mentioned above, a custom kernel is created and compiled for every `Ember` that is rendered. However, compilation is not always required if the `Ember` to be rendered does not differ significantly from the previous one rendered. Differences in the following parameters will trigger a recompilation:
|
||||||
|
|
||||||
|
-Xform count.<br></br>
|
||||||
|
-Presence/absence of post affine transform.<br></br>
|
||||||
|
-Presence/absence of final xform.<br></br>
|
||||||
|
-Presence/absence of xaos.<br></br>
|
||||||
|
-Step/linear palette indexing mode.<br></br>
|
||||||
|
-Variations present in each xform.
|
||||||
|
|
||||||
|
When requesting iteration to commence, the checks above will be made. If any mismatches occur, a recompilation will be triggered right before the kernel launch.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
171
Data/Wiki/EmberImplementationDetails.htm
Normal file
171
Data/Wiki/EmberImplementationDetails.htm
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
#summary Ember implementation details for developers.
|
||||||
|
<font face="Verdana">
|
||||||
|
|
||||||
|
=Introduction=
|
||||||
|
|
||||||
|
This page is intended for developers who wish to get familiar with the Ember code.
|
||||||
|
|
||||||
|
As stated on the main page, the intent of Ember was to re-write the entire flam3 library and the 3 command line programs that use it, in C++. By using modern design and language techniques, a legacy code base was made to be easily understandable to the common programmer. The extensibility of C++ also allows derived projects to implement alternative renderers as they are developed, while still maintaining 100% compatibility with the original. Below are the main design features of Ember and how they compare to the original implementation in flam3.
|
||||||
|
|
||||||
|
Ember takes advantage of a few core language features in C++ that help simplify the coding effort.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
===Templates===
|
||||||
|
|
||||||
|
Since the process of rendering a fractal flame from start to finish is lengthy, it's interesting to experiment with how using different data types affects performance and image quality. flam3 implemented just such a capability, but since C doesn't have the concept of templates, it did something else. It used a tricky method of strategically positioning #include statements after #defines for each type. C++ provides a more elegant solution through the use of template arguments. Ember supports not only changing the data types of the histogram, but of every calculation used in the entire algorithm. Supported types are float and double.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Lambdas===
|
||||||
|
|
||||||
|
These were added to the standard in C++0x and have been a blessing to those implementing multi-threaded programs ever since. Before that, the traditional threading model required a programmer to butcher their design just to achieve parallelism. Modern C++ offers a vast improvement through the use of lambdas. These allow us to write multi-threaded code while keeping good program design structure in tact. Ember achieves this by using the Intel Threading Building Blocks library for all threading needs.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
=Details=
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
==Containers==
|
||||||
|
|
||||||
|
Flam3 contained very verbose code for managing seemingly simple memory operations such as keeping a list of xforms. With the C++ Standard Template Library, such code can be greatly reduced. Containers are used extensively throughout Ember, greatly simplifying the code, reducing its verbosity and enhancing its readability.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
==Variations==
|
||||||
|
|
||||||
|
In flam3, for any action to be taken on a variation, such as calling it or setting parameters, a massive case statement had to be used. The number of cases equaled the number of variations supported by that build. If a new variation was added, all case statements had to be updated.
|
||||||
|
|
||||||
|
In Ember, this cumbersome burden was alleviated by making each variation a class which derived from a base variation class. Each implements a virtual function which does the processing work. Other virtual functions are used for setting random or default states for parametric variations.
|
||||||
|
|
||||||
|
In Apophysis, users can add variations by compiling their own DLLs. Ember could conceivably support such a feature in the future by having DLLs return pointers to base variation objects that have been instantiated as derived variations. However, no such support has been implemented. For the time being, new variation classes will periodically be added to Ember.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
==Iterating==
|
||||||
|
|
||||||
|
Iteration is the portion of the algorithm where the most time is spent. Any possible optimization that can be taken, should be taken within the innermost loops. Flam3 missed a few opportunities to do this, so Ember optimized every last piece to the maximum possible extent.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
===Fusing===
|
||||||
|
|
||||||
|
As stated in the paper, the first 20 iterations are not plotted in order to get a more concentrated image with less stray points. This is somewhat misleading, since the number flam3 actually uses is 15. If early clipping is used, the number of fuse iterations is 100.
|
||||||
|
|
||||||
|
Further deviating from the paper, fusing is not just done at the very beginning. Rather, all iteration is broken up into chunks, or sub batches, of 10,000. At the beginning of each sub batch, the point trajectory is reset, and fused again. Assuming a fuse value of 15 and a sub batch size of 10,000, fusing takes place for 0.0015 of the total iterations.
|
||||||
|
|
||||||
|
For each iteration, flam3 checks to see whether fusing is done yet, if so, the point is plotted. This is wasteful to check for something every iteration that occurs so infrequently. In the interest of maximum efficiency, Ember splits all iteration up into two identical loops, one with fusing and one without. This reduces the number of conditional checks needed.
|
||||||
|
|
||||||
|
A further optimization opportunity was that when a final xform was present, flam3 applied it during fusing, even though the computed point was never used. Ember omits the application of the final xform during fusing.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
===Point Assignment===
|
||||||
|
|
||||||
|
The general structure of the iteration loop in flam3 looks like:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
p2 = xform(p1)
|
||||||
|
save p2 to temp buffer for plotting later
|
||||||
|
p1 = p2
|
||||||
|
}}}
|
||||||
|
|
||||||
|
This was optimized to omit the assignment from p2 back to p1 for the start of the next iteration. Instead, no temporary points are ever created. Rather, the indices of the temporary buffer to read from and write to are incremented. Further, the buffer is read from and written to directly, alleviating the need for temporary assignments. It roughly takes the form of:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
i = 0
|
||||||
|
while (i < SubBatchSize)
|
||||||
|
{
|
||||||
|
xform(buf[i], buf[i + 1])
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
}}}
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
===Xaos===
|
||||||
|
|
||||||
|
When xaos is used, an additional calculation must be performed to look up the next random xform to apply. Ember bypasses this when xaos is not present by having two separate classes for iteration, one with xaos and one without.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
==Filtering==
|
||||||
|
|
||||||
|
For density and spatial filtering, a box of pixels is processed. Flam3 accessed pixels in row, column order. This is cache inefficient because every pixel access is on a different row. Ember optimizes filtering by processing in a more cache-friendly column, row order.
|
||||||
|
|
||||||
|
While flam3 parallelized the Gaussian density filtering, it did not do so for basic log scale filtering (max radius = 0). While this method is seldom used for a final output image, it is used for interactive renders to give a preview image before full iteration is complete. In an effort to give a more responsive GUI, Ember parallelized this method.
|
||||||
|
|
||||||
|
During an interactive render, the only parameters that are usually changing are the affine transforms. Because this doesn't affect many of the other parameters used to render, intelligent checks are used to skip any unnecessary memory allocations each time the main render function is called. This technique is used with density and spatial filters to only recreate them if the requested filter differs from the one previously used.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
==Incremental Rendering==
|
||||||
|
|
||||||
|
Ember is designed to be run from the command line, or from an interactive GUI. To facilitate the latter, the rendering process keeps state information about its progress. This is done so that it can be aborted in mid-render, and resumed later on. It also serves to ensure the minimum amount of processing is performed in response to a change in the `Ember` being rendered. For example, if a render completes and the user only wants to change the vibrancy, then only final accumulation needs to be ran again. Another feature is that if a render completes and the user increases the quality, all previous iteration information is preserved in the histogram and the new iterations for the quality difference are simply added to them.
|
||||||
|
|
||||||
|
The downside of this design is that it admittedly butchers the structure of the main rendering function with numerous conditionals. The cost is worth it as the state-preserving design greatly facilitates interactive rendering from a GUI.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
==Final Accumulation==
|
||||||
|
|
||||||
|
This stage is where color correction and spatial filtering are done. Flam3 did not multi-thread this step because the percentage of the total time spent here is small. Ember easily parallelized it with the aforementioned use of lambdas and TBB. While inconsequential in a headless render, it's very helpful in providing more responsiveness in an interactive render.
|
||||||
|
|
||||||
|
The process was further optimized by eliminating many of the redundant assignments and bounds checks that flam3 did.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
==Xml Parsing==
|
||||||
|
|
||||||
|
While not much of a speed bottleneck, Xml parsing can take some time if reading in a large file, such as is used for animations. Flam3 implemented this in the least efficient manner possible by reading a single character at a time. Ember does this much faster by reading the entire file at once. The structure of the Xml parsing functions remains mostly the same.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
==Affine Transforms==
|
||||||
|
|
||||||
|
In every iteration, these are applied before, and optionally after, variations are applied. Flam3 treated them as an array of 6 coefficients arranged in column, row order. Ember puts them in a class called Affine2D so they can be accessed more clearly using their coefficient labels, A-F. The layout of the two is like so:
|
||||||
|
|
||||||
|
flam3: 3 columns of 2 rows each. Accessed col, row.
|
||||||
|
|
||||||
|
{{{
|
||||||
|
[a(0,0)][b(1,0)][c(2,0)]
|
||||||
|
[d(0,1)][e(1,1)][f(2,1)]
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Ember: 2 columns of 3 rows each. Accessed col, row.
|
||||||
|
|
||||||
|
{{{
|
||||||
|
[a(0,0)][d(1,0)]
|
||||||
|
[b(0,1)][e(1,1)]
|
||||||
|
[c(0,2)][f(1,2)]
|
||||||
|
}}}
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
==Matrices==
|
||||||
|
|
||||||
|
All matrices and vectors are from the glm library and receive the same template argument used to create the classes they're used in.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
==Random Numbers==
|
||||||
|
|
||||||
|
Randomization is at the heart of the fractal flames algorithm. Flam3 used the ISAAC random number generator. Ember does the same, but uses a C++ version with a few additional convenience functions added.
|
||||||
|
|
||||||
|
The flam3 method of using a buffer to hold xform indices to randomly select is also used in Ember. However, flam3 made each element an unsigned short. Since an Ember will have nowhere near 256 xforms, the elements were made to be 1 byte each in an effort to make the buffer fit into the cache better.
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</ul>
|
229
Data/Wiki/FinalRenderDialog.htm
Normal file
229
Data/Wiki/FinalRenderDialog.htm
Normal file
@ -0,0 +1,229 @@
|
|||||||
|
#summary Final render dialog
|
||||||
|
<font face="Verdana">
|
||||||
|
|
||||||
|
=Final Render Dialog=
|
||||||
|
|
||||||
|
This dialog allows the user to render flames to an output file. It can render either the current flame, or all
|
||||||
|
open flames. When rendering all, they can either be treated as individual images, or as frames in an animation. If the
|
||||||
|
later is chosen, temporal samples are used to achieve motion blur. All values specified here will be saved between program runs.
|
||||||
|
|
||||||
|
Before rendering begins, the current flame will be saved back to the opened file in memory.
|
||||||
|
|
||||||
|
Miscellaneous messages are shown in the bottom text box.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
==Early Clip==
|
||||||
|
|
||||||
|
Whether to apply color correction before spatial filtering. It's recommended to only use this if the colors don't look right.
|
||||||
|
|
||||||
|
A more thorough discussion of early clip from the original flam3 documentation is <a href="https://code.google.com/p/flam3/wiki/NewFeatures">here</a>.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Transparency==
|
||||||
|
|
||||||
|
Whether the empty pixels in the image should be transparent, or use the background color. This only applies when saving as PNG.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Use OpenCL==
|
||||||
|
|
||||||
|
Whether to use OpenCL in the rendering process. It is highly recommended that you use this if your video card supports it.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Use Double Precision==
|
||||||
|
|
||||||
|
Whether to use double precision numbers in the rendering process. This will slow down the render and double the memory usage, but will produce a better looking image in some cases.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Save Xml==
|
||||||
|
|
||||||
|
Whether to also save the Xml of every rendered image in the same folder the image is saved.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Render All==
|
||||||
|
|
||||||
|
Whether to render all currently opened flames, or just the current one. When checked, image and Xml output names will be auto generated.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Render as Animation Sequence==
|
||||||
|
|
||||||
|
When Render All is checked, whether to use the Temporal Samples value specified to create motion blurring. Disabled if Render All is unchecked.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Keep Aspect Ratio==
|
||||||
|
|
||||||
|
Whether to keep the aspect ratio of the final output image the same as the original flame. When checked, changing the value of one of the dimensions
|
||||||
|
will cause the other dimension to change a corresponding amount times the aspect ratio of the original.<br></br>
|
||||||
|
The original dimensions will be those of the render preview window if the flame originated in Fractorium.
|
||||||
|
If the flame originated from a file or pasted Xml, the original dimensions will be whatever was specified in those parameters.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Scale==
|
||||||
|
|
||||||
|
The scaling method to use. This is used to adjust the zoom specified in the scale parameter based on the difference between the original image dimensions and the final image dimensions.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
===None===
|
||||||
|
|
||||||
|
Do not adjust the scale parameter in response to the difference between the original dimensions and the final dimensions. This is useful for cropping without zooming.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Width===
|
||||||
|
|
||||||
|
Scale the scale parameter by the percentage difference between the original width and the final width.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Height===
|
||||||
|
|
||||||
|
Scale the scale parameter by the percentage difference between the original height and the final height.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Render All Extension==
|
||||||
|
|
||||||
|
The image type to use when Render All is checked. Disabled if Render All is unchecked.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==OpenCL Platforms==
|
||||||
|
|
||||||
|
The available OpenCL platforms on the system. Disabled if Use OpenCL is unchecked.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==OpenCL Device==
|
||||||
|
|
||||||
|
The available devices on the currently selected platform. Disabled if Use OpenCL is unchecked.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Threads==
|
||||||
|
|
||||||
|
The number of threads to use when using the traditional CPU renderer. Disabled if Use OpenCL is unchecked.
|
||||||
|
|
||||||
|
Range: 1 - number of cores.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Width==
|
||||||
|
|
||||||
|
The width of the final output image.
|
||||||
|
|
||||||
|
Range: 10 - 100,000.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Height==
|
||||||
|
|
||||||
|
The height of the final output image.
|
||||||
|
|
||||||
|
Range: 10 - 100,000.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Quality==
|
||||||
|
|
||||||
|
The quality of the final output image. Values above 500 don't offer noticeable improvement.
|
||||||
|
|
||||||
|
Range: 1 - 200,000.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Temporal Samples==
|
||||||
|
|
||||||
|
The temporal samples to use when applying motion blur. A value of 1000 is recommended. Only used when Render as Animation Sequence is checked, otherwise a value of 1 is internally used.
|
||||||
|
|
||||||
|
Range: 1 - 5,000.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Supersample==
|
||||||
|
|
||||||
|
The value to multiply the dimensions of the histogram and density filter buffer by to help eliminate jagged lines.
|
||||||
|
Values greater than one will greatly impact performance and will increase memory usage. See the Memory Usage field for the effect.
|
||||||
|
|
||||||
|
While a value of 2 offers some visual improvement, values greater than 2 don't offer noticeable improvement.
|
||||||
|
|
||||||
|
Range: 1 - 4.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Memory Usage==
|
||||||
|
|
||||||
|
The amount of memory required for the the entire render, which is the histogram, density filtering buffer and final image.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Output==
|
||||||
|
|
||||||
|
The file to save a single image render to, or the folder to save multiple image renders to. This is set by clicking the ... button.
|
||||||
|
Clicking Open will open the folder location in an explorer window.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Prefix==
|
||||||
|
|
||||||
|
The prefix to prepend to all image and Xml files.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Suffix==
|
||||||
|
|
||||||
|
The suffix to append to all image and Xml files.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Total Progress==
|
||||||
|
|
||||||
|
The percentage of the entire rendering process which has completed.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Iteration==
|
||||||
|
|
||||||
|
The percentage of the iteration step in the current image render which has completed.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Density Filtering==
|
||||||
|
|
||||||
|
The percentage of the density filtering step in the current image render which has completed.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Final Accumulation==
|
||||||
|
|
||||||
|
The percentage of the final color correction and spatial filtering step in the current image render which has completed. This is almost always instantaneous.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Start==
|
||||||
|
|
||||||
|
Begin the rendering process. If a render is already running, it will stop it first.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Stop==
|
||||||
|
|
||||||
|
Stop the rendering process.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Close==
|
||||||
|
|
||||||
|
Stop the rendering process, close the dialog and return to the main window.
|
||||||
|
</li>
|
||||||
|
</ul>
|
319
Data/Wiki/FlameTab.htm
Normal file
319
Data/Wiki/FlameTab.htm
Normal file
@ -0,0 +1,319 @@
|
|||||||
|
#summary Flame tab
|
||||||
|
<font face="Verdana">
|
||||||
|
|
||||||
|
=Flame Tab Item Descriptions=
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
==Color==
|
||||||
|
|
||||||
|
These settings affect color. There is no set combination to make a perfect image. Once you've settled on a design you like,
|
||||||
|
play with different color combinations to give it the desired final look.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
===Brightness===
|
||||||
|
|
||||||
|
The brightness of the final output image.
|
||||||
|
|
||||||
|
Range: 0.05 - 50.
|
||||||
|
|
||||||
|
Render State: Density filtering.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Gamma===
|
||||||
|
|
||||||
|
The gamma of the final output image. Higher values will give better color, but will reveal more scattered points.
|
||||||
|
Lower values will reduce scattered points but will wash the colors out to white.
|
||||||
|
|
||||||
|
Range: 1 - 9999.
|
||||||
|
|
||||||
|
Render State: Final accumulation.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Gamma Threshold===
|
||||||
|
|
||||||
|
The gamma threshold of the final output image. Higher values will reduce scattered points, but will also reduce color quality.
|
||||||
|
Lower values will reveal more scattered points, but give better color.
|
||||||
|
|
||||||
|
Range: 0 - 10.
|
||||||
|
|
||||||
|
Render State: Final accumulation.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Vibrancy===
|
||||||
|
|
||||||
|
The scale factor to apply to the alpha channel log scaling when gamma correcting the final output image. Higher values will
|
||||||
|
give more saturated colors. Lower values will wash the colors out to white.
|
||||||
|
|
||||||
|
Range: 0 - 1.
|
||||||
|
|
||||||
|
Render State: Final accumulation.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Highlight Power===
|
||||||
|
|
||||||
|
The highlight power of the final image. Set this to a value greater than zero if the colors don't look right.
|
||||||
|
|
||||||
|
A more thorough discussion of highlight power from the original flam3 documentation is <a href="https://code.google.com/p/flam3/wiki/HighlightPower">here</a> and <a href="https://code.google.com/p/flam3/wiki/NewFeatures">here</a>.
|
||||||
|
|
||||||
|
Range: -1 - 2.
|
||||||
|
|
||||||
|
Render State: Final accumulation.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Background===
|
||||||
|
|
||||||
|
The background color of the image. Ignored on the final image output if transparency is used.
|
||||||
|
|
||||||
|
Range: 0-255 for RGB.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Palette Mode===
|
||||||
|
|
||||||
|
The mode used for palette indexing when accumulating to the histogram.
|
||||||
|
|
||||||
|
Step: If the specified palette index is a fraction, round down to the nearest integer.
|
||||||
|
|
||||||
|
Linear: Blend the specified index with the one after it.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
==Geometry==
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
===Width===
|
||||||
|
|
||||||
|
The width in pixels of the viewable area. Read only.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Height===
|
||||||
|
|
||||||
|
The height in pixels of the viewable area. Read only.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Center X===
|
||||||
|
|
||||||
|
The center offset of the camera. The image will move in the opposite direction on the X axis.
|
||||||
|
|
||||||
|
Range: -10 - 10.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Center Y===
|
||||||
|
|
||||||
|
The center offset of the camera. The image will move in the opposite direction on the Y axis.
|
||||||
|
|
||||||
|
Range: -10 - 10.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Scale===
|
||||||
|
|
||||||
|
The number of pixels in the final image that correspond to the distance from 0 to 1 in the Cartesian rendering plane.
|
||||||
|
Increasing zooms in, decreasing zooms out. Quality is not scaled when this value is adjusted, so increased values
|
||||||
|
will degrade the final image quality.
|
||||||
|
|
||||||
|
Range: 10 - 3000.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Zoom===
|
||||||
|
|
||||||
|
The zoom level of the final image. Quality is scaled when this value is adjusted, so rendering time is greatly increased.
|
||||||
|
|
||||||
|
Range: 0 - 5.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Rotate===
|
||||||
|
|
||||||
|
The rotation of the final image.
|
||||||
|
|
||||||
|
Range: -180 - 180.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
==Filter==
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
===Spatial Filter Width===
|
||||||
|
|
||||||
|
The width of the spatial filter applied to the final image.
|
||||||
|
|
||||||
|
Range: 0.1 - 10.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Spatial Filter Type===
|
||||||
|
|
||||||
|
The type of the spatial filter applied to the final image.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Temporal Filter Width===
|
||||||
|
|
||||||
|
The width of the temporal filter used during animation. This value has no effect on the
|
||||||
|
interactive renderer, however it's stored in the Xml when saved.
|
||||||
|
|
||||||
|
Render State: Unchanged.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Temporal Filter Type===
|
||||||
|
|
||||||
|
The type of the temporal filter used during animation. This value has no effect on the
|
||||||
|
interactive renderer, however it's stored in the Xml when saved.
|
||||||
|
|
||||||
|
Render State: Unchanged.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===DE Filter Min Radius===
|
||||||
|
|
||||||
|
The minimum filter radius to use when performing density filtering. Increasing this value
|
||||||
|
will add additional blurring even in high density areas, which is generally undesirable. This must
|
||||||
|
always be less than or equal to the DE max radius.
|
||||||
|
|
||||||
|
A more thorough discussion of density filtering from the original flam3 documentation is <a href="https://code.google.com/p/flam3/wiki/DensityEstimation">here</a>.
|
||||||
|
|
||||||
|
Range: 0 - 25.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===DE Filter Max Radius===
|
||||||
|
|
||||||
|
The maximum filter radius to use when performing density filtering. Increasing this value
|
||||||
|
will add additional blurring only to low density areas, which is generally desirable. This must
|
||||||
|
always be greater than or equal to the DE min radius.
|
||||||
|
|
||||||
|
When using OpenCL, if this value multiplied by the supersample is greater than 9, the performance
|
||||||
|
of density filtering will drop to that of the CPU. This is because a filter size greater than 9
|
||||||
|
cannot fit into local shared memory.
|
||||||
|
|
||||||
|
Range: 0 - 25.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===DE Curve===
|
||||||
|
|
||||||
|
The speed with which the density filter values decrease when moving away from the center pixel
|
||||||
|
being filtered. This value will almost never need to be anything other than the default of 0.40.
|
||||||
|
|
||||||
|
Range: 0.01 - 5.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
==Iteration==
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
===Passes===
|
||||||
|
|
||||||
|
The number of steps to break iteration into, applying density filtering each time.
|
||||||
|
|
||||||
|
This value should never be anothing other than one and will most likely be removed in a future release.
|
||||||
|
|
||||||
|
Range: 1 - 3.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Temporal Samples===
|
||||||
|
|
||||||
|
The number of temporal samples used to blend between frames during animation. This value has no effect on the
|
||||||
|
interactive renderer, however it's stored in the Xml when saved.
|
||||||
|
|
||||||
|
Range: 1 - 5,000.
|
||||||
|
|
||||||
|
Render State: Unchanged.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Quality===
|
||||||
|
|
||||||
|
The number of iterations per pixel in the final output image. Suggested values:
|
||||||
|
|
||||||
|
CPU, Interactive: 10
|
||||||
|
|
||||||
|
OpenCL, Interactive: 20 - 60
|
||||||
|
|
||||||
|
Final Render: 2000+
|
||||||
|
|
||||||
|
Values greater than 2000 don't offer much noticeable improvement.
|
||||||
|
|
||||||
|
Range: 1 - 200,000.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Supersample===
|
||||||
|
|
||||||
|
The value to multiply the dimensions of the histogram and density filter buffer by
|
||||||
|
to help eliminate jagged lines. During interactive editing, it should always be one,
|
||||||
|
and should only be increased when preparing for a final render. Values greater than one
|
||||||
|
will greatly impact performance and will increase memory usage.
|
||||||
|
|
||||||
|
While a value of 2 offers some visual improvement, values greater than 2 don't offer noticeable improvement.
|
||||||
|
|
||||||
|
Range: 1 - 4.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Affine Interpolation===
|
||||||
|
|
||||||
|
The method to use when interpolating affine transforms during animation. This value has no effect on the
|
||||||
|
interactive renderer, however it's stored in the Xml when saved.
|
||||||
|
|
||||||
|
Render State: Unchanged.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Interpolation===
|
||||||
|
|
||||||
|
The method to use when interpolating flames during animation. This value has no effect on the
|
||||||
|
interactive renderer, however it's stored in the Xml when saved.
|
||||||
|
|
||||||
|
Render State: Unchanged.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
159
Data/Wiki/FractoriumUserGuide.htm
Normal file
159
Data/Wiki/FractoriumUserGuide.htm
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
#summary User's guide for Fractorium.
|
||||||
|
<font face="Verdana">
|
||||||
|
|
||||||
|
=Introduction=
|
||||||
|
|
||||||
|
Fractorium is a fractal flame editor written in C++ with the Qt library. It uses Ember and EmberCL to perform all rendering.
|
||||||
|
|
||||||
|
The intent of Fractorium is to create an editor which has a cleaner interface, easier usage and better performance than any currently available in order to provide the artist with the best possible experience.
|
||||||
|
<br></br>
|
||||||
|
|
||||||
|
=Details=
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
==General Usage==
|
||||||
|
|
||||||
|
Fractorium aims to allow the artist maximum creative freedom with the minimal possible effort. To achieve this, the entire program was designed to be used with a mouse containing two buttons and a wheel. Using Fractorium with a less capable input device will most likely be cumbersome and is not supported.
|
||||||
|
|
||||||
|
In keeping with the idea of minimizing effort, a novel feature is that the user need not click in the spinners or combo boxes they are editing. Rather, just hover over them and scroll the mouse wheel. Almost every control in the program is designed to be altered with the mouse wheel. Scrolling it only applies to the control the mouse is hovering over. Once the mouse moves away from the control, it loses focus and mouse wheel scrolling no longer applies to it.
|
||||||
|
|
||||||
|
In addition to being designed for a mouse, the user is also meant to have one hand on the keyboard with their fingers on the shift, ctrl and alt keys.
|
||||||
|
|
||||||
|
Most controls have a default non-zero value. Fractorium makes it easy for the user to switch back and forth between a default value and a reasonable non-default value. Just double click in any control with a default value and you will see the value change to a reasonable non-default value. Double click again and it will change back to the default.
|
||||||
|
|
||||||
|
If you need to enter a specific value with finer granularity than is provided by double clicking or mouse wheel scrolling, you can enter it by hand. Select the text of the control and type in it while the mouse is still hovering over it. Be careful not to move the mouse away, because it will cause the control to lose focus.
|
||||||
|
|
||||||
|
Note that all rendering is done without locking the histogram. While this is theoretically imperfect, it doesn't seem to have any visual impact. An option to control this may be revisited later.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Usage Tips==
|
||||||
|
|
||||||
|
A responsive interface has the highest positive impact on user experience. These tips will help get you running in the best possible configuration for your hardware.
|
||||||
|
|
||||||
|
The first step is to enable OpenCL in the options if your video card supports it. This will give incredibly fluid real-time feedback while editing transforms.
|
||||||
|
|
||||||
|
When running with OpenCL enabled, you may find the movement is a little bit jerky if you have a fast card. This is a case of running "too fast". The jerkiness comes from the fact that your card is so fast that it's completing the render in between every mouse movement and is attempting to perform full Gaussian density filtering which can be slow. To avoid this jerkiness, increase the quality slightly to a value between 20 and 50. This will cause the render to take long enough such that full density filtering will not be performed between rapid mouse movements.
|
||||||
|
|
||||||
|
If OpenCL does not work, and you are forced to use the CPU, keep your quality setting on 10. This will give reasonably responsive feedback.
|
||||||
|
|
||||||
|
Regardless of the renderer type being used, do not increase the quality to a high value until your design is solid enough to be ready for a final render. Keep the quality low until you are sure you've got something you want to keep.
|
||||||
|
|
||||||
|
You can optionally select single or double precision numbers. Single is much faster and is highly recommended. Double will produce better image quality but is so slow that it is only recommended when doing a final render.
|
||||||
|
|
||||||
|
Never use supersampling during interactive rendering. It won't produce any noticeable improvement in quality and will greatly slow down performance. Only use it if you want to determine if it will help a final render look better. After experimenting with values greater than one, always restore supersample to one when finished. As a general rule, values higher than 2 don't add any benefit.
|
||||||
|
|
||||||
|
For each mouse movement, a number of iterations are ran before displaying a preview image. This value is controlled by the sub batch count option. Separate values are allowed for CPU and OpenCL. Increase these to get a better preview, decrease them to get more responsive feedback.
|
||||||
|
|
||||||
|
By default, preview images for mouse movements are scaled using basic log density scaling. Only when iteration has fully completed after the mouse is held still is full Gaussian density filtering performed. If you have an extremely fast processor or video card, try setting the filtering method to Full DE. This will perform full Gaussian density filtering on every mouse movement. The processing cost is high, but the feedback is stunning.
|
||||||
|
|
||||||
|
The circles shown on the main display are the affine transforms for each xform. Dragging them around is how most editing is done. Holding down certain keys can alter the effect dragging has on them.
|
||||||
|
|
||||||
|
To get an existing Xml file open in the editor, you can either select it by clicking the File | Open menu, or by dragging and dropping the file onto the window.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
====No Keys====
|
||||||
|
|
||||||
|
X & Y: Rotate and Scale.
|
||||||
|
|
||||||
|
Center: Move.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
====Shift====
|
||||||
|
|
||||||
|
X & Y: Rotate only.
|
||||||
|
|
||||||
|
Local Pivot:
|
||||||
|
|
||||||
|
Center: Rotate around 0,0, while keeping local orientation fixed.
|
||||||
|
|
||||||
|
World Pivot:
|
||||||
|
|
||||||
|
Center: Rotate around 0,0, also rotating local orientation.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
====Control====
|
||||||
|
|
||||||
|
X, Y and Center: Snap current movement to grid.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
====Alt====
|
||||||
|
|
||||||
|
X & Y: Free movement.
|
||||||
|
|
||||||
|
Center: No effect.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
====Shift + Alt====
|
||||||
|
|
||||||
|
Local Pivot:
|
||||||
|
|
||||||
|
X & Y: Rotate around transform center.
|
||||||
|
|
||||||
|
Center: No effect.
|
||||||
|
|
||||||
|
World Pivot:
|
||||||
|
|
||||||
|
X & Y: Rotate around 0,0.
|
||||||
|
|
||||||
|
Center: No effect.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
Dragging the image with the right mouse button rotates and scales.
|
||||||
|
|
||||||
|
Dragging the image with the middle mouse button pans.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Parameter Descriptions==
|
||||||
|
|
||||||
|
Behavior and recommended usage of all UI elements.
|
||||||
|
|
||||||
|
[Menus Menus]<br></br>
|
||||||
|
[Toolbar Toolbar]
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
===Tabs===
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
[FlameTab Flame]<br></br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
[XformsTab Xforms]<br></br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
[PaletteTab Palette]<br></br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
[LibraryTab Library]<br></br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
[InfoTab Info]<br></br>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
===Dialogs===
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
[FinalRenderDialog Final Render]<br></br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
[OptionsDialog Options]<br></br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
[AboutDialog About]<br></br>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
45
Data/Wiki/InfoTab.htm
Normal file
45
Data/Wiki/InfoTab.htm
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#summary Info tab
|
||||||
|
<font face="Verdana">
|
||||||
|
|
||||||
|
=Info Tab Item Descriptions=
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
==Histogram Bounds==
|
||||||
|
|
||||||
|
When the histogram is allocated before starting a render, it does not have the exact dimensions the user requested. Instead, it is slightly larger
|
||||||
|
to allow for filter padding around the edges. The box helps the user understand the relationship between the Cartesian space the histogram represents and the
|
||||||
|
dimensions of the memory allocated for it. This is mostly of engineering interest.
|
||||||
|
|
||||||
|
The corners going clockwise from the top left correspond to the bounds of the Cartesian space the histogram represents. They are upper left,
|
||||||
|
upper right, lower right, lower left.
|
||||||
|
|
||||||
|
The values in the middle of the top and left sides of the box represent the height and width of the histogram in memory.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
===Gutter===
|
||||||
|
|
||||||
|
The amount of padding added to the edges of the histogram to allow for filtering.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===DE Box Dimensions===
|
||||||
|
|
||||||
|
The size of the density filtering box used, with the pixel being filtered in the center. This value is used in calculating the gutter.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==File Opening==
|
||||||
|
|
||||||
|
If there were any warnings or errors opening a file, the details will be displayed here.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Rendering==
|
||||||
|
|
||||||
|
If there were any problems creating a renderer, or finishing the rendering process, the details will be displayed here.
|
||||||
|
</li>
|
||||||
|
</ul>
|
34
Data/Wiki/LibraryTab.htm
Normal file
34
Data/Wiki/LibraryTab.htm
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#summary Library tab
|
||||||
|
<font face="Verdana">
|
||||||
|
|
||||||
|
=Library Tab Item Descriptions=
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
==Current Flame File==
|
||||||
|
|
||||||
|
This shows a list of all flames present in the currently opened file, or randomly generated flock. When editing, the latest updates to the
|
||||||
|
current flame will not be saved back to this list in memory, and the preview will not be updated, unless the user specifically does so. This allows restoration of the original flame
|
||||||
|
if needed.
|
||||||
|
|
||||||
|
|
||||||
|
The entire file will not be saved back to disk unless the user specifically does so.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
===Single click===
|
||||||
|
|
||||||
|
Edit the name of the selected flame. This will be used as the name within the Xml file when the user saves it back to disk.
|
||||||
|
|
||||||
|
Render State: Unchanged.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Double click===
|
||||||
|
|
||||||
|
Set the flame as the current one. This will overwrite any edits currently pending, so be sure to save them first before switching between flames. This will also reset the undo list.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
101
Data/Wiki/MainPage.htm
Normal file
101
Data/Wiki/MainPage.htm
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
=Description=
|
||||||
|
<font face="Verdana" size="2">
|
||||||
|
A Qt-based fractal flame editor which uses a C++ re-write of the flam3 algorithm named Ember and a GPU capable version named EmberCL which implements a portion of the cuburn algorithm in OpenCL.
|
||||||
|
</font>
|
||||||
|
<br></br>
|
||||||
|
|
||||||
|
==Installer (0.3.7.2 Beta)==
|
||||||
|
<font face="Verdana" size="2">
|
||||||
|
<a href="https://drive.google.com/file/d/0Bws5xPbHJph6TThVOHdUZUxVM00/edit?usp=sharing">Windows 7 64-bit Installer</a>
|
||||||
|
</font>
|
||||||
|
<br></br>
|
||||||
|
|
||||||
|
==Documentation==
|
||||||
|
<font face="Verdana" size="2">
|
||||||
|
Get started <a href="https://code.google.com/p/fractorium/wiki/ProjectOverview">here</a>.
|
||||||
|
</font>
|
||||||
|
<br></br>
|
||||||
|
|
||||||
|
==Requirements and Prerequisites==
|
||||||
|
<font face="Verdana" size="2">
|
||||||
|
Windows 7, 64-bit
|
||||||
|
|
||||||
|
Install the latest drivers for your video card
|
||||||
|
|
||||||
|
An nVidia or AMD video card to take advantage of OpenCL
|
||||||
|
|
||||||
|
If you have an Intel processor, but do not have a device capable of running OpenCL, and still want to run Fractorium with only CPU support, you must install Intel's CPU-only OpenCL libraries <a href="http://registrationcenter.intel.com/irc_nas/3608/intel_sdk_for_ocl_applications_2013_r2_runtime_x64_setup.msi">here</a>.
|
||||||
|
</font>
|
||||||
|
<br></br>
|
||||||
|
|
||||||
|
==Running==
|
||||||
|
<font face="Verdana" size="2">
|
||||||
|
Fractorium and its associated command line tools can render fractal flames using the CPU, or OpenCL. In order to use OpenCL, you must have an nVidia card that has the Fermi architecture or later, or a recent AMD card. If you attempt to use an unsupported card, you will receive an error message and the CPU renderer will be used instead.
|
||||||
|
</font><br></br>
|
||||||
|
|
||||||
|
==Current Status==
|
||||||
|
<font face="Verdana" size="2">
|
||||||
|
Initial beta releases supporting the following:
|
||||||
|
|
||||||
|
===Hardware:===
|
||||||
|
-CPU: x64 Intel and AMD CPUs.
|
||||||
|
|
||||||
|
-GPU: Recent AMD and nVidia (Fermi and later) cards.
|
||||||
|
|
||||||
|
===Variations:===
|
||||||
|
-The 98 standard variations included with flam3.
|
||||||
|
|
||||||
|
===Palettes:===
|
||||||
|
-The 700 palettes included in the standard flam3-palettes.xml file.
|
||||||
|
|
||||||
|
===Data Types:===
|
||||||
|
-Single and double precision floating point numbers on both the CPU and the GPU.
|
||||||
|
|
||||||
|
===Compilers:===
|
||||||
|
-Microsoft Visual Studio 2010 SP1 (project files upgrade-able to 2012).
|
||||||
|
|
||||||
|
===Operating Systems:===
|
||||||
|
-Windows 7 x64.
|
||||||
|
</font>
|
||||||
|
|
||||||
|
==Future Direction==
|
||||||
|
<font face="Verdana" size="2">
|
||||||
|
Help is needed and welcome for implementing the following features:
|
||||||
|
|
||||||
|
-Support for Intel and AMD APU chips.
|
||||||
|
|
||||||
|
-More variations from Apophysis.
|
||||||
|
|
||||||
|
-Support for other compilers, such as gcc and MingW.
|
||||||
|
|
||||||
|
-Support for other operating systems, Mac and Linux.
|
||||||
|
|
||||||
|
-Conversion of OpenGL calls to shader programs.
|
||||||
|
|
||||||
|
-Implementation of more alternative rendering methods.
|
||||||
|
|
||||||
|
-Standalone animator/music visualizer.
|
||||||
|
|
||||||
|
-Benchmarking suite.
|
||||||
|
</font><br></br>
|
||||||
|
|
||||||
|
==Gratitude==
|
||||||
|
<font face="Verdana" size="2">
|
||||||
|
A sincere thanks to the following people.
|
||||||
|
|
||||||
|
Code and theory questions:
|
||||||
|
|
||||||
|
Scott Draves
|
||||||
|
|
||||||
|
Erik Reckase
|
||||||
|
|
||||||
|
Steve Robertson
|
||||||
|
|
||||||
|
Mike Thiesen
|
||||||
|
|
||||||
|
Testing:
|
||||||
|
|
||||||
|
Richard Vollebregt
|
||||||
|
|
||||||
|
Tai
|
||||||
|
</font>
|
214
Data/Wiki/Menus.htm
Normal file
214
Data/Wiki/Menus.htm
Normal file
@ -0,0 +1,214 @@
|
|||||||
|
#summary Menus
|
||||||
|
<font face="Verdana">
|
||||||
|
|
||||||
|
=Menu Item Descriptions=
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
===Menu===
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
====File====
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====New Flock=====
|
||||||
|
|
||||||
|
Create a new set of 10 randomly generated flames and set the first one as the current flame. This will clear whatever is currently open.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====New Empty Flame=====
|
||||||
|
|
||||||
|
Add a new empty flame to the end of the open flames and set it as the current flame.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====New Random Flame=====
|
||||||
|
|
||||||
|
Add a new random flame to the end of the open flames and set it as the current flame.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====Copy Flame=====
|
||||||
|
|
||||||
|
Add a copy of the current flame to the end of the open flames and set it as the current flame.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====Open=====
|
||||||
|
|
||||||
|
Open a flame Xml file. This will clear whatever is currently open.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====Save Current as Xml=====
|
||||||
|
|
||||||
|
Save the current flame to an Xml file. If it has not yet been saved, a file save dialog will be shown. On subsequent saves, no dialog will be shown
|
||||||
|
and it will use the filename specified the first time the dialog was shown.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====Save Entire File as Xml=====
|
||||||
|
|
||||||
|
Save the all currently open flames to a single Xml file. If it has not yet been saved, a file save dialog will be shown. On subsequent saves, no dialog will be shown
|
||||||
|
and it will use the filename specified the first time the dialog was shown.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====Save Current Screen=====
|
||||||
|
|
||||||
|
Save the current screen to an image file.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====Save Current To Open File=====
|
||||||
|
|
||||||
|
Save the current flame back to the open flame list in memory. This does not save anything to disk.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====Exit=====
|
||||||
|
|
||||||
|
Exit the program. Save all current work before exiting.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
====Edit====
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
=====Undo=====
|
||||||
|
|
||||||
|
Revert to the previous edit. The undo list is updated upon completion of the rendering process, when not traversing the undo list.
|
||||||
|
|
||||||
|
If an edit is made while traversing the list, the list is cleared.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====Redo=====
|
||||||
|
|
||||||
|
If traversing the undo list, move forward to the next edit.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====Copy Xml=====
|
||||||
|
|
||||||
|
Copy the current flame as an Xml to the clipboard.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====Copy All Xmls=====
|
||||||
|
|
||||||
|
Copy all flames in the currently opened file as Xmls to the clipboard.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====Paste Xml Append=====
|
||||||
|
|
||||||
|
Paste the current clipboard text as a flame appended to the list of currently opened flames.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====Paste Xml Over=====
|
||||||
|
|
||||||
|
Paste the current clipboard text over the list of currently opened flames. This will clear whatever is currently open.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
====Tools====
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
=====Add Reflective Symmetry=====
|
||||||
|
|
||||||
|
Add an xform that will reflect the image along the Y axis. This is accomplished by giving the xform a weight of one, color speed of 0 and
|
||||||
|
a single linear variation with a weight of one. Its affine is centered on 0,0 with X at -1,0 and Y at 0,1.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====Add Rotational Symmetry=====
|
||||||
|
|
||||||
|
Add an xform that will duplicate a rotated portion of the image along the Y axis. This is accomplished by giving the xform a weight of one, color speed of 0 and
|
||||||
|
a single linear variation with a weight of one. Its affine is centered on 0,0 with X at -1,0 and Y at 0,-1.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====Add Reflective and Rotational Symmetry=====
|
||||||
|
|
||||||
|
Add two xforms, one for reflective symmetry and another for rotational symmetry.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====Clear Flame=====
|
||||||
|
|
||||||
|
Clear the current flame such that it only has one xform with no variations, pre and post affine transforms set to the identity matrix, and no xaos.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====Render Previews=====
|
||||||
|
|
||||||
|
Re-render all previews.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====Stop Rendering Previews=====
|
||||||
|
|
||||||
|
Stop rendering previews.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
=====Final Render=====
|
||||||
|
|
||||||
|
Display the final rendering dialog. This will stop the render, and restart it from the beginning when the dialog is closed.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
=====Options=====
|
||||||
|
|
||||||
|
Display the options dialog. This will stop the render, and restart it from the beginning when the dialog is closed.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
====Help====
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
=====About=====
|
||||||
|
|
||||||
|
Show the about box which gives a description, version, and licensing information about the code this project uses.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
178
Data/Wiki/OptionsDialog.htm
Normal file
178
Data/Wiki/OptionsDialog.htm
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
#summary Options Dialog
|
||||||
|
<font face="Verdana">
|
||||||
|
|
||||||
|
=Options=
|
||||||
|
|
||||||
|
Options to use in various parts of Fractorium.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
==Interactive Rendering==
|
||||||
|
|
||||||
|
Options used when editing flames and displaying them in the output window.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
===Early Clip===
|
||||||
|
|
||||||
|
Whether to apply color correction before spatial filtering. It's recommended to only use this if the colors don't look right.
|
||||||
|
|
||||||
|
A more thorough discussion of early clip from the original flam3 documentation is <a href="https://code.google.com/p/flam3/wiki/NewFeatures">here</a>.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Transparency===
|
||||||
|
|
||||||
|
This has no effect since the output window will always have the same color as the flame's specified background color.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Use OpenCL===
|
||||||
|
|
||||||
|
Whether to use OpenCL in the rendering process. It is highly recommended that you use this if your video card supports it.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Use Double Precision===
|
||||||
|
|
||||||
|
Whether to use double precision numbers in the rendering process. This will slow down the render and double the memory usage, but will produce a better looking image in some cases. It is recommended you don't use this for interactive rendering on the GPU unless you have an extremely fast graphics card with double precision support.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===OpenCL Platforms===
|
||||||
|
|
||||||
|
The available OpenCL platforms on the system. Disabled if Use OpenCL is unchecked.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===OpenCL Device===
|
||||||
|
|
||||||
|
The available devices on the currently selected platform. Disabled if Use OpenCL is unchecked.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Threads===
|
||||||
|
|
||||||
|
The number of threads to use when using the traditional CPU renderer. Disabled if Use OpenCL is unchecked.
|
||||||
|
|
||||||
|
Range: 1 - number of cores.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===CPU Sub Batch===
|
||||||
|
|
||||||
|
The number of sub batches of 10,000 iterations to run on each mouse movement. Values between 1 and 10 are recommended.
|
||||||
|
|
||||||
|
Higher values give better preview images, but a less responsive UI. Decrease this value if you have a slower processor.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===OpenCL Sub Batch===
|
||||||
|
|
||||||
|
The number of sub batches of ~8 million iterations to run on each mouse movement. Values between 1 and 3 are recommended.
|
||||||
|
|
||||||
|
Higher values give better preview images, but a less responsive UI. Decrease this value if you have a slower video card.
|
||||||
|
|
||||||
|
Note that since the sub batch size for the OpenCL renderer is so large, low quality renders can complete on the first sub batch. In that case,
|
||||||
|
full density filtering will be performed, which can give a choppy UI. In such cases, increase the quality a bit.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===CPU Filtering===
|
||||||
|
|
||||||
|
The type of filtering to perform for preview renders on each mouse movement when using the CPU renderer. Log scaling is recommended for all but the fastest processors. However, if
|
||||||
|
you have a very fast processor and want to see a more realistic representation of what the final output image will look like on every mouse movement, select
|
||||||
|
the Full DE option.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===OpenCL Filtering===
|
||||||
|
|
||||||
|
The type of filtering to perform for preview renders on each mouse movement when using the OpenCL renderer. Log scaling is recommended for all but the fastest video cards. However, if
|
||||||
|
you have a very fast processor and want to see a more realistic representation of what the final output image will look like on every mouse movement, select
|
||||||
|
the Full DE option.
|
||||||
|
|
||||||
|
Note that as stated above under OpenCL Sub Batch, even if this option is set to log scaling, full DE might get performed on each mouse movement for low quality renders.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Xml Saving==
|
||||||
|
|
||||||
|
When editing flames, the user will save the parameters as an Xml file once they are satisfied with the result. Most of the values will be displayed exactly as they
|
||||||
|
are on the UI. However, there are a few that make sense to override each time.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
===Width===
|
||||||
|
|
||||||
|
The width of the final output image.
|
||||||
|
|
||||||
|
Range: 10 - 100,000.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Height===
|
||||||
|
|
||||||
|
The height of the final output image.
|
||||||
|
|
||||||
|
Range: 10 - 100,000.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Quality===
|
||||||
|
|
||||||
|
The quality of the final output image. Values above 2000 don't offer much noticeable improvement.
|
||||||
|
|
||||||
|
Range: 1 - 200,000.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Temporal Samples===
|
||||||
|
|
||||||
|
The temporal samples to use when applying motion blur. A value of 1000 is recommended. Only used during animation, otherwise the value is overridden with one.
|
||||||
|
|
||||||
|
Range: 1 - 5,000.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Supersample===
|
||||||
|
|
||||||
|
The value to multiply the dimensions of the histogram and density filter buffer by to help eliminate jagged lines.
|
||||||
|
Values greater than one will greatly impact performance and will increase memory usage.
|
||||||
|
|
||||||
|
While a value of 2 offers some visual improvement, values greater than 2 don't offer noticeable improvement.
|
||||||
|
|
||||||
|
Range: 1 - 4.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Identity==
|
||||||
|
|
||||||
|
When saving flame parameters to an Xml file, there is a field for the identity of the artist who made the flame. Fill these out with your identity so that you
|
||||||
|
get proper attribution for your work.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
===Id===
|
||||||
|
|
||||||
|
The identity of the user.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Url===
|
||||||
|
|
||||||
|
The website of the user.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Nick===
|
||||||
|
|
||||||
|
The nick name of the user.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
108
Data/Wiki/PaletteTab.htm
Normal file
108
Data/Wiki/PaletteTab.htm
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
#summary Palette tab
|
||||||
|
<font face="Verdana">
|
||||||
|
|
||||||
|
=Palette Tab Item Descriptions=
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
The list of available palettes as well as optional adjustment values.
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Adjustments==
|
||||||
|
|
||||||
|
Adjustments are applied to the selected palette in the following order: frequency, hue, saturation, brightness, contrast, blur.
|
||||||
|
|
||||||
|
Double clicking a spinner will reset it to its default value.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
===Hue===
|
||||||
|
|
||||||
|
The degrees to rotate the hue of the HSV representation of the RGB color by.
|
||||||
|
|
||||||
|
Range: -180 - 180.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Saturation===
|
||||||
|
|
||||||
|
The percentage to add to the saturation (intensity) component of the HSV representation of the RGB color.
|
||||||
|
|
||||||
|
Range: 0 - 100.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Brightness===
|
||||||
|
|
||||||
|
The value to add to each channel. Negative values bring it toward black, positive values toward white.
|
||||||
|
|
||||||
|
Range: -255 - 255.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Contrast===
|
||||||
|
|
||||||
|
The difference between lightest and darkest colors in the palette. Negative values decrease the difference, and
|
||||||
|
bring the colors toward gray. Positive values increase the difference and make the colors more saturated.
|
||||||
|
|
||||||
|
Range: -100 - 100.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Blur===
|
||||||
|
|
||||||
|
The width in pixels of the blurring.
|
||||||
|
|
||||||
|
Range: 0 - 127.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Frequency===
|
||||||
|
|
||||||
|
The number of times to repeat the palette.
|
||||||
|
|
||||||
|
Range: 1 - 10.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Palette Preview==
|
||||||
|
|
||||||
|
What the final adjusted palette looks like. This is what's used for iteration.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Palette List==
|
||||||
|
|
||||||
|
The full list of palettes and their names in the current palette file, which defaults to flam3-palettes.xml.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
===Single click===
|
||||||
|
|
||||||
|
Set the selected palette as the current one and apply the specified adjustments.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
===Double click===
|
||||||
|
|
||||||
|
Set the selected palette as the current one and reset all adjustments.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
88
Data/Wiki/ProjectOverview.htm
Normal file
88
Data/Wiki/ProjectOverview.htm
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
=Description=
|
||||||
|
<font face="Verdana" size="2">
|
||||||
|
A Qt-based fractal flame editor which uses a C++ re-write of the flam3 algorithm named Ember and a GPU capable version named EmberCL which implements a portion of the cuburn algorithm in OpenCL.
|
||||||
|
</font>
|
||||||
|
<br></br>
|
||||||
|
|
||||||
|
==Installer==
|
||||||
|
<font face="Verdana" size="2">
|
||||||
|
<a href="https://drive.google.com/file/d/0Bws5xPbHJph6Vm1jOVRZSVJ6OUk/edit?usp=sharing">Windows 7 64-bit Installer</a>
|
||||||
|
</font>
|
||||||
|
<br></br>
|
||||||
|
|
||||||
|
==Requirements and Prerequisites==
|
||||||
|
<font face="Verdana" size="2">
|
||||||
|
Windows 7, 64-bit
|
||||||
|
|
||||||
|
Install the latest drivers for your video card
|
||||||
|
|
||||||
|
An nVidia video card to take advantage of OpenCL
|
||||||
|
|
||||||
|
If you have an Intel processor, but do not have a device capable of running OpenCL, and still want to run Fractorium with only CPU support, you must install Intel's CPU-only OpenCL libraries <a href="http://registrationcenter.intel.com/irc_nas/3608/intel_sdk_for_ocl_applications_2013_r2_runtime_x64_setup.msi">here</a>.
|
||||||
|
</font>
|
||||||
|
<br></br>
|
||||||
|
|
||||||
|
==Running==
|
||||||
|
<font face="Verdana" size="2">
|
||||||
|
Fractorium and its associated command line tools can render fractal flames using the CPU, or OpenCL. In order to use OpenCL, you must have an nVidia card that has the Fermi architecture or later. If you attempt to use an unsupported card, you will receive an error message and the CPU renderer will be used instead.
|
||||||
|
|
||||||
|
AMD cards will be supported shortly.
|
||||||
|
</font>
|
||||||
|
<br></br>
|
||||||
|
|
||||||
|
==Current Status==
|
||||||
|
<font face="Verdana" size="2">
|
||||||
|
Initial beta release supporting the following:
|
||||||
|
|
||||||
|
===Hardware:===
|
||||||
|
-CPU: x64 Intel and AMD CPUs.
|
||||||
|
|
||||||
|
-GPU: nVidia Fermi and later cards.
|
||||||
|
|
||||||
|
===Variations:===
|
||||||
|
-The 98 standard variations included with flam3.
|
||||||
|
|
||||||
|
===Palettes:===
|
||||||
|
-The 700 palettes included in the standard flam3-palettes.xml file.
|
||||||
|
|
||||||
|
===Compilers:===
|
||||||
|
-Microsoft Visual Studio 2010 (project files upgrade-able to 2012).
|
||||||
|
|
||||||
|
===Operating Systems:===
|
||||||
|
-Windows 7 x64.
|
||||||
|
</font>
|
||||||
|
|
||||||
|
==Future Direction==
|
||||||
|
<font face="Verdana" size="2">
|
||||||
|
Help is needed and welcome for implementing the following features:
|
||||||
|
|
||||||
|
-Support for AMD hardware.
|
||||||
|
|
||||||
|
-More variations from Apophysis.
|
||||||
|
|
||||||
|
-Support for other compilers, such as gcc and MingW.
|
||||||
|
|
||||||
|
-Support for other operating systems, Mac and Linux.
|
||||||
|
|
||||||
|
-Conversion of OpenGL calls to shader programs.
|
||||||
|
|
||||||
|
-Implementation of more alternative rendering methods.
|
||||||
|
|
||||||
|
-Standalone animator/music visualizer.
|
||||||
|
|
||||||
|
-Benchmarking suite.
|
||||||
|
</font>
|
||||||
|
<br></br>
|
||||||
|
|
||||||
|
==Gratitude==
|
||||||
|
<font face="Verdana" size="2">
|
||||||
|
A sincere thanks to the following people for answering all of my questions:
|
||||||
|
|
||||||
|
Scott Draves
|
||||||
|
|
||||||
|
Erik Reckase
|
||||||
|
|
||||||
|
Steve Robertson
|
||||||
|
|
||||||
|
Mike Thiesen
|
||||||
|
</font>
|
21
Data/Wiki/SideBar.htm
Normal file
21
Data/Wiki/SideBar.htm
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#summary Sidebar
|
||||||
|
* [Users]
|
||||||
|
* [ProjectOverview Overview]
|
||||||
|
* [AlgorithmExplanation Algorithm]
|
||||||
|
* [FractoriumUserGuide Fractorium User's Guide]
|
||||||
|
* [Menus Menus]
|
||||||
|
* [Toolbar Toolbar]
|
||||||
|
* [LibraryTab Library Tab]
|
||||||
|
* [FlameTab Flame Tab]
|
||||||
|
* [XformsTab Xforms Tab]
|
||||||
|
* [PaletteTab Palette Tab]
|
||||||
|
* [InfoTab Info Tab]
|
||||||
|
* [FinalRenderDialog Final Render Dialog]
|
||||||
|
* [OptionsDialog Options Dialog]
|
||||||
|
* [AboutDialog About Dialog]
|
||||||
|
* [CommandLinePrograms Command Line Programs]
|
||||||
|
* [Developers]
|
||||||
|
* [EmberImplementationDetails Ember]
|
||||||
|
* [EmberCLImplementationDetails EmberCL]
|
||||||
|
* [Building Building]
|
||||||
|
* [CodingPhilosophy Coding Philosophy]
|
9
Data/Wiki/Toolbar.htm
Normal file
9
Data/Wiki/Toolbar.htm
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#summary Toolbars
|
||||||
|
<font face="Verdana">
|
||||||
|
=Toolbar Item Descriptions=
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
===Toolbar===
|
||||||
|
|
||||||
|
Buttons perform the same functions as the menu items of the same names.
|
||||||
|
</ul>
|
18
Data/Wiki/Users.htm
Normal file
18
Data/Wiki/Users.htm
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#summary Information for users.
|
||||||
|
|
||||||
|
[ProjectOverview Overview]
|
||||||
|
|
||||||
|
[AlgorithmExplanation Algorithm]
|
||||||
|
|
||||||
|
[FractoriumUserGuide Fractorium User's Guide]
|
||||||
|
[Menus Menus]<br></br>
|
||||||
|
[Toolbar Toolbar]<br></br>
|
||||||
|
[LibraryTab Library]<br></br>
|
||||||
|
[FlameTab Flame Tab]<br></br>
|
||||||
|
[XformsTab Xforms]<br></br>
|
||||||
|
[PaletteTab Palette]<br></br>
|
||||||
|
[InfoTab Info]<br></br>
|
||||||
|
[FinalRenderDialog Final Render Dialog]<br></br>
|
||||||
|
[OptionsDialog Options Dialog]<br></br>
|
||||||
|
[AboutDialog About Dialog]
|
||||||
|
[CommandLinePrograms Command Line Programs]
|
343
Data/Wiki/XformsTab.htm
Normal file
343
Data/Wiki/XformsTab.htm
Normal file
@ -0,0 +1,343 @@
|
|||||||
|
#summary Xforms tab
|
||||||
|
<font face="Verdana">
|
||||||
|
|
||||||
|
=Xforms Tab Item Descriptions=
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
==Current Xform==
|
||||||
|
|
||||||
|
The number shown is the index of the currently selected xform. The values on all controls within the xforms tab
|
||||||
|
will be from the current xform.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Add Xform==
|
||||||
|
|
||||||
|
Add an empty xform to the current flame and set it as the current one. It will have no variations and its affine trasforms will be set to the identity matrix
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Duplicate Xform==
|
||||||
|
|
||||||
|
Make a copy of the current xform and add it to the end of the xforms and set it as the current one.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Clear Xform Variations==
|
||||||
|
|
||||||
|
Delete all variations from the current xform.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Delete Xform==
|
||||||
|
|
||||||
|
Delete the current xform from the flame.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Add Final Xform==
|
||||||
|
|
||||||
|
Add a final xform if one is not already present.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Weight==
|
||||||
|
|
||||||
|
The probability that the current xform will be chosen among the others during iteration. Note that all weight values
|
||||||
|
are normalized before iteration begins.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Equalize Weights==
|
||||||
|
|
||||||
|
Set all xform weights to be 1 / xform count.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Name==
|
||||||
|
|
||||||
|
Optional name for this xform to help more easily identify it. Note this values is only used for display purposes
|
||||||
|
in Fractorium and is not saved to the Xml file.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
==Color==
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Color Index===
|
||||||
|
|
||||||
|
The index in the palette the current xform uses. This value can be changed by scrolling the mouse wheel in the box displaying the value
|
||||||
|
or by dragging the scroll bar.
|
||||||
|
|
||||||
|
Range: 0 - 1.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Color Speed===
|
||||||
|
|
||||||
|
The speed with which the color indices are pulled toward the current xform's color index. This value can be negative.
|
||||||
|
|
||||||
|
Range: -1 - 1.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Opacity===
|
||||||
|
|
||||||
|
How visible the current xform's contribution to the image is. 0 is invisible, 1 is totally visible.
|
||||||
|
|
||||||
|
Range: 0 - 1.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Solo===
|
||||||
|
|
||||||
|
When checked, the current xform is the only visible one. The text of the checkbox specifies which xform is
|
||||||
|
the solo one. If none are selected as solo, no number is displayed. This feature is useful for determining how much
|
||||||
|
each xform contributes to the final image.
|
||||||
|
|
||||||
|
Note that checking this does not affect the opacity values stored in the Xml file when saved.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
==Affine==
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Pre Affine Transform===
|
||||||
|
|
||||||
|
The affine transform applied to the input points before variations are applied on each iteration.
|
||||||
|
|
||||||
|
The values correspond to the usual affine transform of:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
tx = Ax * By + C
|
||||||
|
ty = Dx * Ey + F
|
||||||
|
}}}
|
||||||
|
|
||||||
|
like so:
|
||||||
|
|
||||||
|
A: X1, D: X2
|
||||||
|
|
||||||
|
B: Y1, E: Y2
|
||||||
|
|
||||||
|
C: O1, F: O2
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
====Enable====
|
||||||
|
|
||||||
|
Checking/unchecking shows/hides pre affine transforms and enables/disables the controls.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
====Reset====
|
||||||
|
|
||||||
|
Reset the pre affine transform to the identity matrix.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
====Adjustments====
|
||||||
|
|
||||||
|
Change the values of the pre affine transform as the tool tips describe.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
====Show Current/All====
|
||||||
|
|
||||||
|
Show current only draws a circle around the current xform's pre affine transform.
|
||||||
|
|
||||||
|
Show all draws a circle around all xforms' pre affine transforms. This can sometimes clutter
|
||||||
|
the view if the flame contains many xforms, hence the option to only show current.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Post Affine Transform===
|
||||||
|
|
||||||
|
The affine transform applied to the sum of the applying the variations.
|
||||||
|
|
||||||
|
The values correspond to the usual affine transform of:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
tx = Ax * By + C
|
||||||
|
ty = Dx * Ey + F
|
||||||
|
}}}
|
||||||
|
|
||||||
|
like so:
|
||||||
|
|
||||||
|
A: X1, D: X2
|
||||||
|
|
||||||
|
B: Y1, E: Y2
|
||||||
|
|
||||||
|
C: O1, F: O2
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
====Enable====
|
||||||
|
|
||||||
|
Checking/unchecking shows/hides post affine transforms and enables/disables the controls.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
====Reset====
|
||||||
|
|
||||||
|
Reset the post affine transform to the identity matrix.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
====Adjustments====
|
||||||
|
|
||||||
|
Change the values of the post affine transform as the tool tips describe.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
====Show Current/All====
|
||||||
|
|
||||||
|
Show current only draws a circle around the current xform's post affine transform.
|
||||||
|
|
||||||
|
Show all draws a circle around all xforms' post affine transforms. This can sometimes clutter
|
||||||
|
the view if the flame contains many xforms, hence the option to only show current.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Pivot===
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
====When dragging the X or Y component of an affine transform and holding Shift+Alt:====
|
||||||
|
|
||||||
|
Local: Rotates the point around the center of the transform.
|
||||||
|
|
||||||
|
World: Rotates the point around 0, 0.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
====When dragging the center of an affine transform and holding Shift:====
|
||||||
|
|
||||||
|
Local: Rotates entire transform around the origin, keeping its local orientation fixed.
|
||||||
|
|
||||||
|
World: Rotates entire transform around the origin, also rotating the local orientation.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
====When reflecting an affine transform:====
|
||||||
|
|
||||||
|
Local: Reflect horizontally and vertically around the center of the transform.
|
||||||
|
|
||||||
|
World: Reflect horizontallly around the Y axis, and vertically around the X axis.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Variations==
|
||||||
|
<ul>
|
||||||
|
Each xform has one or more variations contained in it that get applied during each iteration. The value to the right of the
|
||||||
|
variation name is its weight. Values below it in sub-tree items are for parametric variations.
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Weight===
|
||||||
|
|
||||||
|
Add a variation to the current xform by scrolling its weight to a non-zero value. Remove it by scrolling
|
||||||
|
its weight back to zero. Variations present in the current xform will have a gray background to make them easily
|
||||||
|
identifiable.
|
||||||
|
|
||||||
|
A quick way to add or remove a variation is to double click the weight spinner, which will flip the weight
|
||||||
|
between 0 and 1.
|
||||||
|
|
||||||
|
Adding or removing variations will trigger an OpenCL recompile, so you will see a slight pause when doing so.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Search===
|
||||||
|
|
||||||
|
Typing in this box does a case insensitive search which will only show variations
|
||||||
|
with matching text. To restore all, click the X button to the right.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Sorting===
|
||||||
|
|
||||||
|
Clicking on the left header column will sort by variation ID (which is hidden from the user).
|
||||||
|
|
||||||
|
Clicking on the right header column will sort by weight, placing all variations in the current xform
|
||||||
|
with non-zero weights at the top.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
==Xaos==
|
||||||
|
<ul>
|
||||||
|
Xaos is an advanced feature that adds an element of control to the random selection of xforms during iteration.
|
||||||
|
It adds an adjustment to the probability that a given xform will be selected based on the xform that was selected in the previous iteration.
|
||||||
|
|
||||||
|
Each of the spinners in the right column show a value to adjust the probability of the scenario described in the left column by.
|
||||||
|
|
||||||
|
Values greater than one make it more likely to happen, values less than one make it less likely. Setting all values equal to one indicate no xaos is used.
|
||||||
|
|
||||||
|
Render State: Full render.
|
||||||
|
|
||||||
|
<li>
|
||||||
|
===Direction===
|
||||||
|
|
||||||
|
Different users understand xaos more easily based on the "direction" the terms are specified in. Switching the direction changes the text description in the left column
|
||||||
|
and changes the spinner values accordingly.
|
||||||
|
|
||||||
|
To: Adjust the probability of each xform being selected when going from the currently selected xform "to" all of the others.
|
||||||
|
|
||||||
|
From: Adjust the probability of the currently selected xform being selected when coming "from" all of the others.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
===Clear Xaos===
|
||||||
|
|
||||||
|
Set all xaos values in all xforms to 1.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
23135
Data/flam3-palettes.xml
Normal file
23135
Data/flam3-palettes.xml
Normal file
File diff suppressed because it is too large
Load Diff
474
Data/gplv3.rtf
Normal file
474
Data/gplv3.rtf
Normal file
@ -0,0 +1,474 @@
|
|||||||
|
{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31506\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}
|
||||||
|
{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}
|
||||||
|
{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
|
||||||
|
{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}
|
||||||
|
{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
|
||||||
|
{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}
|
||||||
|
{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
|
||||||
|
{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
|
||||||
|
{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f49\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\f50\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}
|
||||||
|
{\f52\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f53\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f54\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f55\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}
|
||||||
|
{\f56\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f57\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f409\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f410\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}
|
||||||
|
{\f412\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f413\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f416\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f417\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}
|
||||||
|
{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
|
||||||
|
{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
|
||||||
|
{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
|
||||||
|
{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}
|
||||||
|
{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}
|
||||||
|
{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}
|
||||||
|
{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}
|
||||||
|
{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
|
||||||
|
{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
|
||||||
|
{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}
|
||||||
|
{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
|
||||||
|
{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
|
||||||
|
{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
|
||||||
|
{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}
|
||||||
|
{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}
|
||||||
|
{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}
|
||||||
|
{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}
|
||||||
|
{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
|
||||||
|
{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
|
||||||
|
{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}
|
||||||
|
{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;
|
||||||
|
\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red53\green56\blue42;}{\*\defchp \f31506\fs22 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1
|
||||||
|
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025
|
||||||
|
\ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\s3\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0
|
||||||
|
\rtlch\fcs1 \ab\af0\afs27\alang1025 \ltrch\fcs0 \b\fs27\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext3 \slink15 \sqformat \spriority9 \styrsid8467792 heading 3;}{
|
||||||
|
\s4\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033
|
||||||
|
\sbasedon0 \snext4 \slink16 \sqformat \spriority9 \styrsid8467792 heading 4;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\*
|
||||||
|
\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1
|
||||||
|
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}{\*\cs15 \additive
|
||||||
|
\rtlch\fcs1 \ab\af0\afs27 \ltrch\fcs0 \b\f0\fs27 \sbasedon10 \slink3 \slocked \spriority9 \styrsid8467792 Heading 3 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24 \sbasedon10 \slink4 \slocked \spriority9 \styrsid8467792
|
||||||
|
Heading 4 Char;}{\s17\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033
|
||||||
|
\sbasedon0 \snext17 \ssemihidden \sunhideused \styrsid8467792 Normal (Web);}{\*\cs18 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 \ssemihidden \sunhideused \styrsid8467792 Hyperlink;}}{\*\listtable{\list\listtemplateid1944733200{\listlevel
|
||||||
|
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
|
||||||
|
\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
|
||||||
|
\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0
|
||||||
|
\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
|
||||||
|
\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}
|
||||||
|
\f10\fs20\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li5040
|
||||||
|
\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }
|
||||||
|
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid341057278}
|
||||||
|
{\list\listtemplateid1071024108{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23
|
||||||
|
\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
|
||||||
|
\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
|
||||||
|
\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0
|
||||||
|
\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
|
||||||
|
\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}
|
||||||
|
\f10\fs20\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li5760
|
||||||
|
\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }
|
||||||
|
{\listname ;}\listid598561567}{\list\listtemplateid1482595662{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li720
|
||||||
|
\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel
|
||||||
|
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0
|
||||||
|
\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
|
||||||
|
\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0
|
||||||
|
\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
|
||||||
|
\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}
|
||||||
|
\f10\fs20\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li6480
|
||||||
|
\jclisttab\tx6480\lin6480 }{\listname ;}\listid1629435584}}{\*\listoverridetable{\listoverride\listid1629435584\listoverridecount1{\lfolevel\listoverrideformat{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0
|
||||||
|
\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }}\ls1}{\listoverride\listid341057278\listoverridecount1{\lfolevel\listoverrideformat{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
|
||||||
|
\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }}\ls2}{\listoverride\listid598561567\listoverridecount1{\lfolevel\listoverrideformat{\listlevel\levelnfc23
|
||||||
|
\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }}\ls3}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}}
|
||||||
|
{\*\rsidtbl \rsid6316632\rsid8003581\rsid8467792}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Person}{\operator Person}{\creatim\yr2013\mo11\dy24\hr12\min3}
|
||||||
|
{\revtim\yr2013\mo11\dy24\hr12\min3}{\version2}{\edmins0}{\nofpages12}{\nofwords4738}{\nofchars27009}{\nofcharsws31684}{\vern49167}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}
|
||||||
|
\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect
|
||||||
|
\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen
|
||||||
|
\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1
|
||||||
|
\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct
|
||||||
|
\asianbrkrule\rsidroot6316632\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0
|
||||||
|
{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang
|
||||||
|
{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang
|
||||||
|
{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}
|
||||||
|
\pard\plain \ltrpar\qc \li0\ri0\sb240\sa240\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0
|
||||||
|
\f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af1\afs38 \ltrch\fcs0 \b\f1\fs38\cf17\insrsid8467792\charrsid8467792 GNU GENERAL PUBLIC LICENSE
|
||||||
|
\par }\pard \ltrpar\qc \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792 Version 3, 29 June 2007
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792 Copyright \'a9
|
||||||
|
2007 Free Software Foundation, Inc. <}{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792 HYPERLINK "http://fsf.org/" }}{\fldrslt {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0
|
||||||
|
\f1\fs21\ul\cf12\insrsid8467792\charrsid8467792 http://fsf.org/}}}\sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792 >
|
||||||
|
\par Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sb240\sa240\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs38 \ltrch\fcs0 \b\f1\fs38\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart preamble}{\*\bkmkend preamble}Preamble
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792
|
||||||
|
The GNU General Public License is a free, copyleft license for software and other kinds of works.
|
||||||
|
\par The licenses for most software
|
||||||
|
and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free
|
||||||
|
software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.
|
||||||
|
\par When we speak of free soft
|
||||||
|
ware, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want i
|
||||||
|
t, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
|
||||||
|
\par To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you ha
|
||||||
|
ve certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.
|
||||||
|
\par For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the reci
|
||||||
|
pients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
|
||||||
|
\par Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.
|
||||||
|
\par For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both use
|
||||||
|
rs' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.
|
||||||
|
\par Some devices are designed to deny users access to install or run modified versio
|
||||||
|
ns of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals t
|
||||||
|
o
|
||||||
|
use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to thos
|
||||||
|
e domains in future versions of the GPL, as needed to protect the freedom of users.
|
||||||
|
\par Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers
|
||||||
|
, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.
|
||||||
|
\par The precise terms and conditions for copying, distribution and modification follow.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sb240\sa240\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs38 \ltrch\fcs0 \b\f1\fs38\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart terms}{\*\bkmkend terms}TERMS AND CONDITIONS
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs31 \ltrch\fcs0 \b\f1\fs31\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart section0}{\*\bkmkend section0}0. Definitions.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792 \'93This License\'94
|
||||||
|
refers to version 3 of the GNU General Public License.
|
||||||
|
\par \'93Copyright\'94 also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
|
||||||
|
\par \'93The Program\'94 refers to any copyrightable work licensed under this License. Each licensee is addressed as \'93you\'94. \'93Licensees\'94 and \'93recipients\'94 may be individuals or organizations.
|
||||||
|
\par To \'93modify\'94 a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a \'93modified version\'94 of the earlier work or a work \'93
|
||||||
|
based on\'94 the earlier work.
|
||||||
|
\par A \'93covered work\'94 means either the unmodified Program or a work based on the Program.
|
||||||
|
\par To \'93propagate\'94 a work means to do anything with it that, without permission, would make you directly or secondarily liable for infr
|
||||||
|
ingement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as we
|
||||||
|
ll.
|
||||||
|
\par To \'93convey\'94 a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
|
||||||
|
\par An interactive user interface displays \'93Appropriate Legal Notices\'94
|
||||||
|
to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provi
|
||||||
|
ded), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs31 \ltrch\fcs0 \b\f1\fs31\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart section1}{\*\bkmkend section1}1. Source Code.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792 The \'93source code\'94
|
||||||
|
for a work means the preferred form of the work for making modifications to it. \'93Object code\'94 means any non-source form of a work.
|
||||||
|
\par A \'93Standard Interface\'94 means an interface that either is an official standard defined by a recognized standards body,
|
||||||
|
or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
|
||||||
|
\par The \'93System Libraries\'94 of an executable work include anything, other than the work as a whole, that (a) is in
|
||||||
|
cluded in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available
|
||||||
|
to the public in source code form. A \'93Major Component\'94
|
||||||
|
, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
|
\par The \'93Corresponding Source\'94 for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to
|
||||||
|
control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Cor
|
||||||
|
r
|
||||||
|
esponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communi
|
||||||
|
cation or control flow between those subprograms and other parts of the work.
|
||||||
|
\par The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
|
||||||
|
\par The Corresponding Source for a work in source code form is that same work.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs31 \ltrch\fcs0 \b\f1\fs31\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart section2}{\*\bkmkend section2}2. Basic Permissions.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792
|
||||||
|
All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited pe
|
||||||
|
rmission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided
|
||||||
|
by copyright law.
|
||||||
|
\par You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exc
|
||||||
|
lusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must
|
||||||
|
do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
|
||||||
|
\par Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs31 \ltrch\fcs0 \b\f1\fs31\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart section3}{\*\bkmkend section3}3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792
|
||||||
|
No covered work shall be deemed part of an effective technological measure under any applicable law fulfill
|
||||||
|
ing obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
|
||||||
|
\par When you convey a covered work, you waive any legal power to forbid circumvention of techn
|
||||||
|
ological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the wor
|
||||||
|
k's users, your or third parties' legal rights to forbid circumvention of technological measures.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs31 \ltrch\fcs0 \b\f1\fs31\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart section4}{\*\bkmkend section4}4. Conveying Verbatim Copies.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792
|
||||||
|
You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; a
|
||||||
|
nd give all recipients a copy of this License along with the Program.
|
||||||
|
\par You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs31 \ltrch\fcs0 \b\f1\fs31\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart section5}{\*\bkmkend section5}5. Conveying Modified Source Versions.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792
|
||||||
|
You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f3\fs20\cf17\insrsid8467792\charrsid8467792 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ltrpar\ql \fi-360\li336\ri240\sl312\slmult0\widctlpar
|
||||||
|
\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin240\lin336\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792 a) The work m
|
||||||
|
ust carry prominent notices stating that you modified it, and giving a relevant date.
|
||||||
|
\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f3\fs20\cf17\insrsid8467792\charrsid8467792 \loch\af3\dbch\af0\hich\f3 \'b7\tab}
|
||||||
|
b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to \'93keep intact all notices\'94.
|
||||||
|
\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f3\fs20\cf17\insrsid8467792\charrsid8467792 \loch\af3\dbch\af0\hich\f3 \'b7\tab}
|
||||||
|
c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the
|
||||||
|
whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
|
||||||
|
\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f3\fs20\cf17\insrsid8467792\charrsid8467792 \loch\af3\dbch\af0\hich\f3 \'b7\tab}d) If the work has interactive
|
||||||
|
user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792
|
||||||
|
A compilation of a covered work with other separate and inde
|
||||||
|
pendent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an \'93aggregate\'94
|
||||||
|
if the compilation and its res
|
||||||
|
ulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
|
||||||
|
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs31 \ltrch\fcs0 \b\f1\fs31\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart section6}{\*\bkmkend section6}6. Conveying Non-Source Forms.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792
|
||||||
|
You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
|
||||||
|
\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f3\fs20\cf17\insrsid8467792\charrsid8467792 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ltrpar\ql \fi-360\li336\ri240\sl312\slmult0\widctlpar
|
||||||
|
\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin240\lin336\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792 a) Convey the o
|
||||||
|
bject code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
|
||||||
|
\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f3\fs20\cf17\insrsid8467792\charrsid8467792 \loch\af3\dbch\af0\hich\f3 \'b7\tab}b) Convey the object code in, or embodied in
|
||||||
|
, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the obj
|
||||||
|
e
|
||||||
|
ct code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically
|
||||||
|
performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
|
||||||
|
\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f3\fs20\cf17\insrsid8467792\charrsid8467792 \loch\af3\dbch\af0\hich\f3 \'b7\tab}
|
||||||
|
c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is
|
||||||
|
allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
|
||||||
|
\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f3\fs20\cf17\insrsid8467792\charrsid8467792 \loch\af3\dbch\af0\hich\f3 \'b7\tab}
|
||||||
|
d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent ac
|
||||||
|
cess to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corres
|
||||||
|
p
|
||||||
|
onding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what ser
|
||||||
|
ver hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
|
||||||
|
\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f3\fs20\cf17\insrsid8467792\charrsid8467792 \loch\af3\dbch\af0\hich\f3 \'b7\tab}
|
||||||
|
e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792
|
||||||
|
A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
|
||||||
|
\par A \'93User Product\'94 is either (1) a \'93consumer product\'94, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwell
|
||||||
|
ing. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, \'93normally used\'94
|
||||||
|
refers to a typical or common use of that class of product, regardle
|
||||||
|
ss of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or no
|
||||||
|
n-consumer uses, unless such uses represent the only significant mode of use of the product.
|
||||||
|
\par \'93Installation Information\'94 for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versi
|
||||||
|
ons of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because mod
|
||||||
|
ification has been made.
|
||||||
|
\par If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transfer
|
||||||
|
red to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if n
|
||||||
|
either you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
|
||||||
|
\par The requirement to provide Installation Information does not include a requirement to continue to provi
|
||||||
|
de support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adv
|
||||||
|
ersely affects the operation of the network or violates the rules and protocols for communication across the network.
|
||||||
|
\par Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly docu
|
||||||
|
mented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs31 \ltrch\fcs0 \b\f1\fs31\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart section7}{\*\bkmkend section7}7. Additional Terms.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792 \'93Additional permissions\'94
|
||||||
|
are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this Lic
|
||||||
|
ense, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to
|
||||||
|
the additional permissions.
|
||||||
|
\par When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when
|
||||||
|
you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
|
||||||
|
\par Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
|
||||||
|
\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f3\fs20\cf17\insrsid8467792\charrsid8467792 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ltrpar\ql \fi-360\li336\ri240\sl312\slmult0\widctlpar
|
||||||
|
\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin240\lin336\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792
|
||||||
|
a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
|
||||||
|
\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f3\fs20\cf17\insrsid8467792\charrsid8467792 \loch\af3\dbch\af0\hich\f3 \'b7\tab}b) Requiring preserv
|
||||||
|
ation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
|
||||||
|
\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f3\fs20\cf17\insrsid8467792\charrsid8467792 \loch\af3\dbch\af0\hich\f3 \'b7\tab}c) Prohibiting misrepresentation of the origin of that material, or requiring that modified version
|
||||||
|
s of such material be marked in reasonable ways as different from the original version; or
|
||||||
|
\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f3\fs20\cf17\insrsid8467792\charrsid8467792 \loch\af3\dbch\af0\hich\f3 \'b7\tab}d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
|
||||||
|
\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f3\fs20\cf17\insrsid8467792\charrsid8467792 \loch\af3\dbch\af0\hich\f3 \'b7\tab}e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
|
\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f3\fs20\cf17\insrsid8467792\charrsid8467792 \loch\af3\dbch\af0\hich\f3 \'b7\tab}
|
||||||
|
f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability t
|
||||||
|
hat these contractual assumptions directly impose on those licensors and authors.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792
|
||||||
|
All other non-permissive additional terms are considered \'93further restrictions\'94 within the meaning of section 10. If the Program as you received it, or any part of it, contai
|
||||||
|
ns a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to
|
||||||
|
a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
|
||||||
|
\par If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
|
||||||
|
\par Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs31 \ltrch\fcs0 \b\f1\fs31\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart section8}{\*\bkmkend section8}8. Termination.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792
|
||||||
|
You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate you
|
||||||
|
r rights under this License (including any patent licenses granted under the third paragraph of section 11).
|
||||||
|
\par However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless a
|
||||||
|
nd until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
|
||||||
|
\par Moreover, your license from a par
|
||||||
|
ticular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and
|
||||||
|
you cure the violation prior to 30 days after your receipt of the notice.
|
||||||
|
\par Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been termi
|
||||||
|
nated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs31 \ltrch\fcs0 \b\f1\fs31\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart section9}{\*\bkmkend section9}9. Acceptance Not Required for Having Copies.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792
|
||||||
|
You are not required to accept this License in order to receive or run a copy of the Prog
|
||||||
|
ram. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify
|
||||||
|
any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs31 \ltrch\fcs0 \b\f1\fs31\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart section10}{\*\bkmkend section10}10. Automatic Licensing of Downstream Recipients.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792 Each time
|
||||||
|
you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
|
\par An \'93entity transaction\'94
|
||||||
|
is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party
|
||||||
|
to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the
|
||||||
|
predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
|
||||||
|
\par You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royal
|
||||||
|
ty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or
|
||||||
|
importing the Program or any portion of it.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs31 \ltrch\fcs0 \b\f1\fs31\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart section11}{\*\bkmkend section11}11. Patents.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792 A \'93contributor\'94
|
||||||
|
is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's \'93contributor version\'94.
|
||||||
|
\par A contributor's \'93essential patent claims\'94
|
||||||
|
are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling it
|
||||||
|
s contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, \'93control\'94
|
||||||
|
includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
|
||||||
|
\par Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propaga
|
||||||
|
te the contents of its contributor version.
|
||||||
|
\par In the following three paragraphs, a \'93patent license\'94 is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To \'93
|
||||||
|
grant\'94 such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
|
||||||
|
\par If you convey a covered work, knowingly relying on a patent license, and the Corresponding Sour
|
||||||
|
ce of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so availab
|
||||||
|
le, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. \'93
|
||||||
|
Knowingly relying\'94 me
|
||||||
|
ans you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to
|
||||||
|
believe are valid.
|
||||||
|
\par If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them
|
||||||
|
to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
|
||||||
|
\par A patent license is \'93discriminatory\'94 if it does not include w
|
||||||
|
ithin the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a
|
||||||
|
t
|
||||||
|
hird party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the co
|
||||||
|
v
|
||||||
|
ered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covere
|
||||||
|
d work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
|
||||||
|
\par Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs31 \ltrch\fcs0 \b\f1\fs31\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart section12}{\*\bkmkend section12}12. No Surrender of Others' Freedom.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792
|
||||||
|
If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of
|
||||||
|
this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate
|
||||||
|
you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs31 \ltrch\fcs0 \b\f1\fs31\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart section13}{\*\bkmkend section13}13. Use with the GNU Affero General Public License.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792
|
||||||
|
Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work
|
||||||
|
. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.
|
||||||
|
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs31 \ltrch\fcs0 \b\f1\fs31\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart section14}{\*\bkmkend section14}14. Revised Versions of this License.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792
|
||||||
|
The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
|
||||||
|
|
||||||
|
\par Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License \'93or any later version\'94 applies to it, you have the option of following the term
|
||||||
|
s and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free S
|
||||||
|
oftware Foundation.
|
||||||
|
\par If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
|
||||||
|
\par Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs31 \ltrch\fcs0 \b\f1\fs31\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart section15}{\*\bkmkend section15}15. Disclaimer of Warranty.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792 THERE IS NO W
|
||||||
|
ARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \'93AS IS\'94
|
||||||
|
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs31 \ltrch\fcs0 \b\f1\fs31\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart section16}{\*\bkmkend section16}16. Limitation of Liability.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792
|
||||||
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILUR
|
||||||
|
E OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sl360\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \ab\af1\afs31 \ltrch\fcs0 \b\f1\fs31\cf17\insrsid8467792\charrsid8467792
|
||||||
|
{\*\bkmkstart section17}{\*\bkmkend section17}17. Interpretation of Sections 15 and 16.
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa240\sl312\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8467792 \cbpat8 {\rtlch\fcs1 \af1\afs21 \ltrch\fcs0 \f1\fs21\cf17\insrsid8467792\charrsid8467792
|
||||||
|
If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connec
|
||||||
|
tion with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
|
||||||
|
\par END OF TERMS AND CONDITIONS
|
||||||
|
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid8003581
|
||||||
|
\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a
|
||||||
|
9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad
|
||||||
|
5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6
|
||||||
|
b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0
|
||||||
|
0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6
|
||||||
|
a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f
|
||||||
|
c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512
|
||||||
|
0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462
|
||||||
|
a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865
|
||||||
|
6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b
|
||||||
|
4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b
|
||||||
|
4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210030dd4329a8060000a41b0000160000007468656d652f7468656d652f
|
||||||
|
7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87
|
||||||
|
615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad
|
||||||
|
79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b
|
||||||
|
5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab
|
||||||
|
999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9
|
||||||
|
699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586
|
||||||
|
8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6
|
||||||
|
0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f
|
||||||
|
9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be
|
||||||
|
15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979
|
||||||
|
3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d
|
||||||
|
32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a
|
||||||
|
f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86
|
||||||
|
e877f0034e16bafb0e258ebb4faf06b769e888340b103d331115bebc4eb813bf83291b63624a0d1475a756c734f9bbc2cd28546ecbe1e20a3794ca175f3fae90
|
||||||
|
fb6d2dd99bb07b55e5ccf68942bd0877b23c77b908e8db5f9db7f024d9239010f35bd4bbe2fcae387bfff9e2bc289f2fbe24cfaa301468dd8bd846dbb4ddf1c2
|
||||||
|
ae7b4c191ba8292337a469bc25ec3d411f06f53a73e224c5292c8de0516732307070a1c0660d125c7d44553488700a4d7bddd3444299910e254ab984c3a219ae
|
||||||
|
a4adf1d0f82b7bd46cea4388ad1c12ab5d1ed8e1153d9c9f350a3246aad01c6873462b9ac05999ad5cc988826eafc3acae853a33b7ba11cd1445875ba1b236b1
|
||||||
|
399483c90bd560b0b0263435085a21b0f22a9cf9356b38ec6046026d77eba3dc2dc60b17e92219e180643ed27acffba86e9c94c7ca9c225a0f1b0cfae0788ad5
|
||||||
|
4adc5a9aec1b703b8b93caec1a0bd8e5de7b132fe5113cf312503b998e2c2927274bd051db6b35979b1ef271daf6c6704e86c73805af4bdd476216c26593af84
|
||||||
|
0dfb5393d964f9cc9bad5c313709ea70f561ed3ea7b053075221d51696910d0d339585004b34272bff7213cc7a510a5454a3b349b1b206c1f0af490176745d4b
|
||||||
|
c663e2abb2b34b23da76f6352ba57ca2881844c1111ab189d8c7e07e1daaa04f40255c77988aa05fe06e4e5bdb4cb9c5394bbaf28d98c1d971ccd20867e556a7
|
||||||
|
689ec9166e0a522183792b8907ba55ca6e943bbf2a26e52f48957218ffcf54d1fb09dc3eac04da033e5c0d0b8c74a6b43d2e54c4a10aa511f5fb021a07533b20
|
||||||
|
5ae07e17a621a8e082dafc17e450ffb739676998b48643a4daa7211214f623150942f6a02c99e83b85583ddbbb2c4996113211551257a656ec1139246ca86be0
|
||||||
|
aadedb3d1441a89b6a929501833b197fee7b9641a3503739e57c732a59b1f7da1cf8a73b1f9bcca0945b874d4393dbbf10b1680f66bbaa5d6f96e77b6f59113d
|
||||||
|
316bb31a795600b3d256d0cad2fe354538e7566b2bd69cc6cbcd5c38f0e2bcc63058344429dc2121fd07f63f2a7c66bf76e80d75c8f7a1b622f878a18941d840
|
||||||
|
545fb28d07d205d20e8ea071b283369834296bdaac75d256cb37eb0bee740bbe278cad253b8bbfcf69eca23973d939b97891c6ce2cecd8da8e2d343578f6648a
|
||||||
|
c2d0383fc818c798cf64e52f597c740f1cbd05df0c264c49134cf09d4a60e8a107260f20f92d47b374e32f000000ffff0300504b030414000600080000002100
|
||||||
|
0dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f7
|
||||||
|
8277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89
|
||||||
|
d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd500
|
||||||
|
1996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0f
|
||||||
|
bfff0000001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6
|
||||||
|
a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a
|
||||||
|
0000001c00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021
|
||||||
|
0030dd4329a8060000a41b00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d001400060008
|
||||||
|
00000021000dd1909fb60000001b0100002700000000000000000000000000b20900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000ad0a00000000}
|
||||||
|
{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d
|
||||||
|
617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169
|
||||||
|
6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363
|
||||||
|
656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e}
|
||||||
|
{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4;
|
||||||
|
\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;
|
||||||
|
\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7;
|
||||||
|
\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;
|
||||||
|
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000
|
||||||
|
4d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000
|
||||||
|
d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||||
|
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||||
|
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||||
|
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||||
|
fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||||
|
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||||
|
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||||
|
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||||
|
ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000401f
|
||||||
|
3d3b50e9ce01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000
|
||||||
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000
|
||||||
|
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000
|
||||||
|
0000000000000000000000000000000000000000000000000105000000000000}}
|
352
Source/Ember/Affine2D.cpp
Normal file
352
Source/Ember/Affine2D.cpp
Normal file
@ -0,0 +1,352 @@
|
|||||||
|
#include "EmberPch.h"
|
||||||
|
#include "Affine2D.h"
|
||||||
|
|
||||||
|
namespace EmberNs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Default constructor which sets the matrix to the identity.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
Affine2D<T>::Affine2D()
|
||||||
|
{
|
||||||
|
MakeID();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which takes each column of the affine as a separate parameter.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">A and D</param>
|
||||||
|
/// <param name="y">B and E</param>
|
||||||
|
/// <param name="t">C and F</param>
|
||||||
|
template <typename T>
|
||||||
|
Affine2D<T>::Affine2D(v2T& x, v2T& y, v2T& t)
|
||||||
|
{
|
||||||
|
X(x);
|
||||||
|
Y(y);
|
||||||
|
O(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which takes all six of the affine values as parameters.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="xx">A</param>
|
||||||
|
/// <param name="xy">D</param>
|
||||||
|
/// <param name="yx">B</param>
|
||||||
|
/// <param name="yy">E</param>
|
||||||
|
/// <param name="tx">C</param>
|
||||||
|
/// <param name="ty">F</param>
|
||||||
|
template <typename T>
|
||||||
|
Affine2D<T>::Affine2D(T xx, T xy, T yx, T yy, T tx, T ty)
|
||||||
|
{
|
||||||
|
A(xx);
|
||||||
|
D(xy);
|
||||||
|
B(yx);
|
||||||
|
E(yy);
|
||||||
|
C(tx);
|
||||||
|
F(ty);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which takes a 4x4 matrix and assigns the
|
||||||
|
/// corresponding values in the 2x3 affine matrix.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="mat">The 4x4 affine matrix to read from</param>
|
||||||
|
template <typename T>
|
||||||
|
Affine2D<T>::Affine2D(m4T& mat)
|
||||||
|
{
|
||||||
|
A(mat[0][0]);
|
||||||
|
B(mat[0][1]);
|
||||||
|
C(mat[0][3]);
|
||||||
|
D(mat[1][0]);
|
||||||
|
E(mat[1][1]);
|
||||||
|
F(mat[1][3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Make this affine transform the identity matrix.
|
||||||
|
/// A and E = 1, all else 0.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
void Affine2D<T>::MakeID()
|
||||||
|
{
|
||||||
|
A(1);
|
||||||
|
B(0);
|
||||||
|
C(0);
|
||||||
|
D(0);
|
||||||
|
E(1);
|
||||||
|
F(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determine whether this affine transform is the identity matrix.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>True if A and E are equal to 1 and all others are 0, else false.</returns>
|
||||||
|
template <typename T>
|
||||||
|
bool Affine2D<T>::IsID() const
|
||||||
|
{
|
||||||
|
return (IsClose<T>(A(), 1)) &&
|
||||||
|
(IsClose<T>(B(), 0)) &&
|
||||||
|
(IsClose<T>(C(), 0)) &&
|
||||||
|
(IsClose<T>(D(), 0)) &&
|
||||||
|
(IsClose<T>(E(), 1)) &&
|
||||||
|
(IsClose<T>(F(), 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determine whether this affine transform is all zeroes.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>True if all 6 elements equal zero, else false.</returns>
|
||||||
|
template <typename T>
|
||||||
|
bool Affine2D<T>::IsZero() const
|
||||||
|
{
|
||||||
|
return (IsClose<T>(A(), 0)) &&
|
||||||
|
(IsClose<T>(B(), 0)) &&
|
||||||
|
(IsClose<T>(C(), 0)) &&
|
||||||
|
(IsClose<T>(D(), 0)) &&
|
||||||
|
(IsClose<T>(E(), 0)) &&
|
||||||
|
(IsClose<T>(F(), 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Rotate this affine transform around its origin by the specified angle in degrees.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="angle">The angle to rotate by</param>
|
||||||
|
template <typename T>
|
||||||
|
void Affine2D<T>::Rotate(T angle)
|
||||||
|
{
|
||||||
|
m4T origMat4 = ToMat4ColMajor(true);//Must center and use column major for glm to work.
|
||||||
|
m4T newMat4 = glm::rotate(origMat4, angle * DEG_2_RAD_T, v3T(0, 0, 1));//Assuming only rotating around z.
|
||||||
|
|
||||||
|
A(newMat4[0][0]);//Use direct assignments instead of constructor to skip assigning C and F.
|
||||||
|
B(newMat4[0][1]);
|
||||||
|
D(newMat4[1][0]);
|
||||||
|
E(newMat4[1][1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Move by v.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="v">The vec2 describing how far to move in the x and y directions</param>
|
||||||
|
template <typename T>
|
||||||
|
void Affine2D<T>::Translate(v2T& v)
|
||||||
|
{
|
||||||
|
O(O() + v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Rotate and scale the X and Y components by a certain amount based on X.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="v">The vec2 describing how much to rotate and scale the X and Y components</param>
|
||||||
|
template <typename T>
|
||||||
|
void Affine2D<T>::RotateScaleXTo(v2T& v)
|
||||||
|
{
|
||||||
|
Affine2D<T> rs = CalcRotateScale(X(), v);
|
||||||
|
|
||||||
|
X(rs.TransformNormal(X()));
|
||||||
|
Y(rs.TransformNormal(Y()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Rotate and scale the X and Y components by a certain amount based on Y.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="v">The vec2 describing how much to rotate and scale the X and Y components</param>
|
||||||
|
template <typename T>
|
||||||
|
void Affine2D<T>::RotateScaleYTo(v2T& v)
|
||||||
|
{
|
||||||
|
Affine2D<T> rs = CalcRotateScale(Y(), v);
|
||||||
|
|
||||||
|
X(rs.TransformNormal(X()));
|
||||||
|
Y(rs.TransformNormal(Y()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the inverse of the 2x3 affine matrix.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The inverse of this affine transform</returns>
|
||||||
|
template <typename T>
|
||||||
|
Affine2D<T> Affine2D<T>::Inverse() const
|
||||||
|
{
|
||||||
|
T det = A() * E() - D() * B();
|
||||||
|
|
||||||
|
return Affine2D<T>(E() / det, -D() / det,
|
||||||
|
-B() / det, A() / det,
|
||||||
|
(F() * B() - C() * E()) / det, (C() * D() - F() * A()) / det);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return a vec2 gotten from transforming this affine transform
|
||||||
|
/// by the vec2 passed in, but with a T component of 0, 0.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="v">The vec2 describing how much to transform by</param>
|
||||||
|
/// <returns>The centered, transformed vec2</returns>
|
||||||
|
template <typename T>
|
||||||
|
typename v2T Affine2D<T>::TransformNormal(const v2T& v) const
|
||||||
|
{
|
||||||
|
return v2T(A() * v.x + B() * v.y, D() * v.x + E() * v.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return a vec2 gotten from transforming this affine transform
|
||||||
|
/// by the vec2 passed in, and applying T translation.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="v">The vec2 describing how much to transform by</param>
|
||||||
|
/// <returns>The translated, transformed vec2</returns>
|
||||||
|
template <typename T>
|
||||||
|
typename v2T Affine2D<T>::TransformVector(const v2T& v) const
|
||||||
|
{
|
||||||
|
return v2T(A() * v.x + B() * v.y + C(), D() * v.x + E() * v.y + F());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the X and Y components as a 2x2 matrix in column major order.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The 2x2 matrix</returns>
|
||||||
|
template <typename T>
|
||||||
|
typename m2T Affine2D<T>::ToMat2ColMajor() const
|
||||||
|
{
|
||||||
|
return m2T(A(), B(),//Col0...
|
||||||
|
D(), E());//1
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the X and Y components as a 2x2 matrix in row major order.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The 2x2 matrix</returns>
|
||||||
|
template <typename T>
|
||||||
|
typename m2T Affine2D<T>::ToMat2RowMajor() const
|
||||||
|
{
|
||||||
|
return m2T(A(), D(),//Col0...
|
||||||
|
B(), E());//1
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the 2x3 affine transform matrix as a 4x4 matrix in column major order.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="center">Whether to use T translation value or just 0 for center</param>
|
||||||
|
/// <returns>The 4x4 matrix</returns>
|
||||||
|
template <typename T>
|
||||||
|
typename m4T Affine2D<T>::ToMat4ColMajor(bool center) const
|
||||||
|
{
|
||||||
|
m4T mat(A(), B(), 0, center ? 0 : C(),//Col0...
|
||||||
|
D(), E(), 0, center ? 0 : F(),//1
|
||||||
|
0, 0, 1, 0,//2
|
||||||
|
0, 0, 0, 1);//3
|
||||||
|
|
||||||
|
return mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the 2x3 affine transform matrix as a 4x4 matrix in row major order.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="center">Whether to use T translation value or just 0 for center</param>
|
||||||
|
/// <returns>The 4x4 matrix</returns>
|
||||||
|
template <typename T>
|
||||||
|
typename m4T Affine2D<T>::ToMat4RowMajor(bool center) const
|
||||||
|
{
|
||||||
|
m4T mat(A(), D(), 0, 0,
|
||||||
|
B(), E(), 0, 0,
|
||||||
|
0, 0, 1, 0,
|
||||||
|
center ? 0 : C(), center ? 0 : F(), 0, 1);
|
||||||
|
|
||||||
|
return mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// == operator which tests if all fields are equal with another Affine2D.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="affine">The Affine2D to compare to</param>
|
||||||
|
/// <returns>True if all fields are equal, else false</returns>
|
||||||
|
template <typename T>
|
||||||
|
bool Affine2D<T>::operator == (const Affine2D<T>& affine)
|
||||||
|
{
|
||||||
|
return IsClose(A(), affine.A()) &&
|
||||||
|
IsClose(B(), affine.B()) &&
|
||||||
|
IsClose(C(), affine.C()) &&
|
||||||
|
IsClose(D(), affine.D()) &&
|
||||||
|
IsClose(E(), affine.E()) &&
|
||||||
|
IsClose(F(), affine.F());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// * operator to multiply this affine transform by another and return the result.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="affine">The Affine2D to multiply by</param>
|
||||||
|
/// <returns>A new Affine2D which is the product of the multiplication</returns>
|
||||||
|
template <typename T>
|
||||||
|
Affine2D<T>& Affine2D<T>::operator * (const Affine2D<T>& affine)
|
||||||
|
{
|
||||||
|
X(TransformNormal(affine.X()));
|
||||||
|
Y(TransformNormal(affine.Y()));
|
||||||
|
O(TransformVector(affine.O()));
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// * operator to multiply this affine transform by a vec2 and return the result as a vec2.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="v">The vec2 to multiply by</param>
|
||||||
|
/// <returns>A new vec2 which is the product of the multiplication</returns>
|
||||||
|
template <typename T>
|
||||||
|
typename v2T Affine2D<T>::operator * (const v2T& v)
|
||||||
|
{
|
||||||
|
return TransformVector(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Accessors.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T> T Affine2D<T>::A() const { return m_Mat[0][0]; }//[0][0]//flam3
|
||||||
|
template <typename T> T Affine2D<T>::B() const { return m_Mat[0][1]; }//[1][0]
|
||||||
|
template <typename T> T Affine2D<T>::C() const { return m_Mat[0][2]; }//[2][0]
|
||||||
|
template <typename T> T Affine2D<T>::D() const { return m_Mat[1][0]; }//[0][1]
|
||||||
|
template <typename T> T Affine2D<T>::E() const { return m_Mat[1][1]; }//[1][1]
|
||||||
|
template <typename T> T Affine2D<T>::F() const { return m_Mat[1][2]; }//[2][1]
|
||||||
|
|
||||||
|
template <typename T> void Affine2D<T>::A(T a) { m_Mat[0][0] = a; }
|
||||||
|
template <typename T> void Affine2D<T>::B(T b) { m_Mat[0][1] = b; }
|
||||||
|
template <typename T> void Affine2D<T>::C(T c) { m_Mat[0][2] = c; }
|
||||||
|
template <typename T> void Affine2D<T>::D(T d) { m_Mat[1][0] = d; }
|
||||||
|
template <typename T> void Affine2D<T>::E(T e) { m_Mat[1][1] = e; }
|
||||||
|
template <typename T> void Affine2D<T>::F(T f) { m_Mat[1][2] = f; }
|
||||||
|
|
||||||
|
template <typename T> typename v2T Affine2D<T>::X() const { return v2T(A(), D()); }//X Axis.
|
||||||
|
template <typename T> typename v2T Affine2D<T>::Y() const { return v2T(B(), E()); }//Y Axis.
|
||||||
|
template <typename T> typename v2T Affine2D<T>::O() const { return v2T(C(), F()); }//Translation.
|
||||||
|
|
||||||
|
template <typename T> void Affine2D<T>::X(v2T& x) { A(x.x); D(x.y); }//X Axis.
|
||||||
|
template <typename T> void Affine2D<T>::Y(v2T& y) { B(y.x); E(y.y); }//Y Axis.
|
||||||
|
template <typename T> void Affine2D<T>::O(v2T& t) { C(t.x); F(t.y); }//Translation.
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Rotate and scale this affine transform and return as a copy. Orginal is unchanged.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="from">The starting point to rotate and scale from</param>
|
||||||
|
/// <param name="to">The ending point to rotate and scale to</param>
|
||||||
|
/// <returns>The newly rotated and scalled Affine2D</returns>
|
||||||
|
template <typename T>
|
||||||
|
Affine2D<T> Affine2D<T>::CalcRotateScale(v2T& from, v2T& to)
|
||||||
|
{
|
||||||
|
T a, c;
|
||||||
|
|
||||||
|
CalcRSAC(from, to, a, c);
|
||||||
|
return Affine2D<T>(a, c, -c, a, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Never fully understood what this did or why it's named what it is.
|
||||||
|
/// But it seems to handle some rotating and scaling.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="from">The starting point to rotate and scale from</param>
|
||||||
|
/// <param name="to">The ending point to rotate and scale to</param>
|
||||||
|
/// <param name="a">a</param>
|
||||||
|
/// <param name="c">c</param>
|
||||||
|
template <typename T>
|
||||||
|
void Affine2D<T>::CalcRSAC(v2T& from, v2T& to, T& a, T& c)
|
||||||
|
{
|
||||||
|
T lsq = from.x * from.x + from.y * from.y;
|
||||||
|
|
||||||
|
a = (from.y * to.y + from.x * to.x) / lsq;
|
||||||
|
c = (from.x * to.y - from.y * to.x) / lsq;
|
||||||
|
}
|
||||||
|
}
|
142
Source/Ember/Affine2D.h
Normal file
142
Source/Ember/Affine2D.h
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Utils.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Affine2D class.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberNs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Uses matrix composition to handle the
|
||||||
|
/// affine matrix. Taken almost entirely from
|
||||||
|
/// Fractron, but using glm, and in C++.
|
||||||
|
/// Note that the matrix layout differs from flam3 so it's best to use
|
||||||
|
/// the A, B, C, D, E, F wrappers around the underlying matrix indices. But if the matrix must
|
||||||
|
/// be accessed directly, the two are laid out as such:
|
||||||
|
/// flam3: 3 columns of 2 rows each. Accessed col, row.
|
||||||
|
/// [a(0,0)][b(1,0)][c(2,0)]
|
||||||
|
/// [d(0,1)][e(1,1)][f(2,1)]
|
||||||
|
/// Ember: 2 columns of 3 rows each. Accessed col, row.
|
||||||
|
/// [a(0,0)][d(1,0)]
|
||||||
|
/// [b(0,1)][e(1,1)]
|
||||||
|
/// [c(0,2)][f(1,2)]
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API Affine2D
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Affine2D();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Default copy constructor.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="affine">The Affine2D object to copy</param>
|
||||||
|
Affine2D(const Affine2D<T>& affine)
|
||||||
|
{
|
||||||
|
Affine2D<T>::operator=<T>(affine);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copy constructor to copy an Affine2D object of type U.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="affine">The Affine2D object to copy</param>
|
||||||
|
template <typename U>
|
||||||
|
Affine2D(const Affine2D<U>& affine)
|
||||||
|
{
|
||||||
|
Affine2D<T>::operator=<U>(affine);
|
||||||
|
}
|
||||||
|
|
||||||
|
Affine2D(v2T& x, v2T& y, v2T& t);
|
||||||
|
Affine2D(T xx, T xy, T yx, T yy, T tx, T ty);
|
||||||
|
Affine2D(m4T& mat);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Default assignment operator.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="affine">The Affine2D object to copy</param>
|
||||||
|
Affine2D<T>& operator = (const Affine2D<T>& affine)
|
||||||
|
{
|
||||||
|
if (this != &affine)
|
||||||
|
Affine2D<T>::operator=<T>(affine);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Assignment operator to assign an Affine2D object of type U.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="affine">The Affine2D object to copy.</param>
|
||||||
|
/// <returns>Reference to updated self</returns>
|
||||||
|
template <typename U>
|
||||||
|
Affine2D<T>& operator = (const Affine2D<U>& affine)
|
||||||
|
{
|
||||||
|
A(T(affine.A()));
|
||||||
|
B(T(affine.B()));
|
||||||
|
C(T(affine.C()));
|
||||||
|
D(T(affine.D()));
|
||||||
|
E(T(affine.E()));
|
||||||
|
F(T(affine.F()));
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void MakeID();
|
||||||
|
inline bool IsID() const;
|
||||||
|
inline bool IsZero() const;
|
||||||
|
inline void Rotate(T angle);
|
||||||
|
inline void Translate(v2T& v);
|
||||||
|
inline void RotateScaleXTo(v2T& v);
|
||||||
|
inline void RotateScaleYTo(v2T& v);
|
||||||
|
inline Affine2D<T> Inverse() const;
|
||||||
|
inline v2T TransformNormal(const v2T& v) const;
|
||||||
|
inline v2T TransformVector(const v2T& v) const;
|
||||||
|
inline m2T ToMat2ColMajor() const;
|
||||||
|
inline m2T ToMat2RowMajor() const;
|
||||||
|
inline m4T ToMat4ColMajor(bool center = false) const;
|
||||||
|
inline m4T ToMat4RowMajor(bool center = false) const;
|
||||||
|
|
||||||
|
bool operator == (const Affine2D<T>& affine);
|
||||||
|
Affine2D<T>& operator * (const Affine2D<T>& affine);
|
||||||
|
v2T operator * (const v2T& v);
|
||||||
|
|
||||||
|
inline T A() const;
|
||||||
|
inline T B() const;
|
||||||
|
inline T C() const;
|
||||||
|
inline T D() const;
|
||||||
|
inline T E() const;
|
||||||
|
inline T F() const;
|
||||||
|
|
||||||
|
inline void A(T a);
|
||||||
|
inline void B(T b);
|
||||||
|
inline void C(T c);
|
||||||
|
inline void D(T d);
|
||||||
|
inline void E(T e);
|
||||||
|
inline void F(T f);
|
||||||
|
|
||||||
|
inline v2T X() const;
|
||||||
|
inline v2T Y() const;
|
||||||
|
inline v2T O() const;
|
||||||
|
|
||||||
|
inline void X(v2T& x);
|
||||||
|
inline void Y(v2T& y);
|
||||||
|
inline void O(v2T& t);
|
||||||
|
|
||||||
|
//static Affine2D Identity();//Complains about inline.
|
||||||
|
static inline Affine2D CalcRotateScale(v2T& from, v2T& to);
|
||||||
|
static inline void CalcRSAC(v2T& from, v2T& to, T& a, T& c);
|
||||||
|
|
||||||
|
m23T m_Mat;
|
||||||
|
};
|
||||||
|
|
||||||
|
//This class had to be implemented in a cpp file because the compiler was breaking.
|
||||||
|
//So the explicit instantiation must be declared here rather than in Ember.cpp where
|
||||||
|
//all of the other classes are done.
|
||||||
|
template EMBER_API class Affine2D<float>;
|
||||||
|
|
||||||
|
#ifdef DO_DOUBLE
|
||||||
|
template EMBER_API class Affine2D<double>;
|
||||||
|
#endif
|
||||||
|
}
|
252
Source/Ember/CarToRas.h
Normal file
252
Source/Ember/CarToRas.h
Normal file
@ -0,0 +1,252 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Point.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// CarToRas class.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberNs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// When iterating, everything is positioned in terms of a carteseian plane with 0,0 in the center like so:
|
||||||
|
/// [-1,1] [1,1]
|
||||||
|
/// [-1,-1] [1,-1]
|
||||||
|
/// However, when accumulating to the histogram, the data is stored in the traditional raster coordinate system
|
||||||
|
/// of 0,0 at the top left and x,y at the bottom right. This class provides functionality to convert from one
|
||||||
|
/// to the other and is used when accumulating a sub batch of iteration results to the histogram.
|
||||||
|
/// Note the functions use reference arguments for the converted values because they are slightly faster than returning a value.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API CarToRas
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Empty constructor. This class should never be used unless it's been properly constructed with the constructor that takes arguments.
|
||||||
|
/// </summary>
|
||||||
|
CarToRas()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor that takes arguments to set up the bounds and passes them to Init().
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="carLlX">The lower left x of the cartesian plane</param>
|
||||||
|
/// <param name="carLlY">The lower left y of the cartesian plane</param>
|
||||||
|
/// <param name="carUrX">The upper right x of the cartesian plane</param>
|
||||||
|
/// <param name="carUrY">The upper right y of the cartesian plane</param>
|
||||||
|
/// <param name="rasW">The width in pixels of the raster image/histogram</param>
|
||||||
|
/// <param name="rasH">The height in pixels of the raster image/histogram</param>
|
||||||
|
/// <param name="aspectRatio">The aspect ratio, generally 1</param>
|
||||||
|
CarToRas(T carLlX, T carLlY, T carUrX, T carUrY, unsigned int rasW, unsigned int rasH, T aspectRatio)
|
||||||
|
{
|
||||||
|
Init(carLlX, carLlY, carUrX, carUrY, rasW, rasH, aspectRatio);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Default copy constructor.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="carToRas">The CarToRas object to copy</param>
|
||||||
|
CarToRas(const CarToRas<T>& carToRas)
|
||||||
|
{
|
||||||
|
CarToRas<T>::operator=<T>(carToRas);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copy constructor to copy a CarToRas object of type U.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="carToRas">The CarToRas object to copy</param>
|
||||||
|
template <typename U>
|
||||||
|
CarToRas(const CarToRas<U>& carToRas)
|
||||||
|
{
|
||||||
|
CarToRas<T>::operator=<U>(carToRas);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Default assignment operator.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="carToRas">The CarToRas object to copy</param>
|
||||||
|
CarToRas<T>& operator = (const CarToRas<T>& carToRas)
|
||||||
|
{
|
||||||
|
if (this != &carToRas)
|
||||||
|
CarToRas<T>::operator=<T>(carToRas);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Assignment operator to assign a CarToRas object of type U.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="carToRas">The CarToRas object to copy.</param>
|
||||||
|
/// <returns>Reference to updated self</returns>
|
||||||
|
template <typename U>
|
||||||
|
CarToRas<T>& operator = (const CarToRas<U>& carToRas)
|
||||||
|
{
|
||||||
|
m_RasWidth = carToRas.RasWidth();
|
||||||
|
m_RasHeight = carToRas.RasHeight();
|
||||||
|
m_OneRow = T(carToRas.OneRow());
|
||||||
|
m_OneCol = T(carToRas.OneCol());
|
||||||
|
m_PixPerImageUnitW = T(carToRas.PixPerImageUnitW());
|
||||||
|
m_RasLlX = T(carToRas.RasLlX());
|
||||||
|
m_PixPerImageUnitH = T(carToRas.PixPerImageUnitH());
|
||||||
|
m_RasLlY = T(carToRas.RasLlY());
|
||||||
|
m_CarLlX = T(carToRas.CarLlX());
|
||||||
|
m_CarLlY = T(carToRas.CarLlY());
|
||||||
|
m_CarUrX = T(carToRas.CarUrX());
|
||||||
|
m_CarUrY = T(carToRas.CarUrY());
|
||||||
|
m_PadCarLlX = T(carToRas.PadCarLlX());
|
||||||
|
m_PadCarLlY = T(carToRas.PadCarLlY());
|
||||||
|
m_PadCarUrX = T(carToRas.PadCarUrX());
|
||||||
|
m_PadCarUrY = T(carToRas.PadCarUrY());
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initialize the dimensions with the specified bounds.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="carLlX">The lower left x of the cartesian plane</param>
|
||||||
|
/// <param name="carLlY">The lower left y of the cartesian plane</param>
|
||||||
|
/// <param name="carUrX">The upper right x of the cartesian plane</param>
|
||||||
|
/// <param name="carUrY">The upper right y of the cartesian plane</param>
|
||||||
|
/// <param name="rasW">The width in pixels of the raster image/histogram</param>
|
||||||
|
/// <param name="rasH">The height in pixels of the raster image/histogram</param>
|
||||||
|
/// <param name="aspectRatio">The aspect ratio, generally 1</param>
|
||||||
|
void Init(T carLlX, T carLlY, T carUrX, T carUrY, unsigned int rasW, unsigned int rasH, T aspectRatio)
|
||||||
|
{
|
||||||
|
m_RasWidth = rasW;
|
||||||
|
m_RasHeight = rasH;
|
||||||
|
|
||||||
|
m_CarLlX = carLlX;
|
||||||
|
m_CarLlY = carLlY;
|
||||||
|
m_CarUrX = carUrX;
|
||||||
|
m_CarUrY = carUrY;
|
||||||
|
|
||||||
|
T carW = m_CarUrX - m_CarLlX;//Right minus left.
|
||||||
|
T carH = m_CarUrY - m_CarLlY;//Top minus bottom.
|
||||||
|
T invSizeW = T(1.0) / carW;
|
||||||
|
T invSizeH = T(1.0) / carH;
|
||||||
|
|
||||||
|
m_PixPerImageUnitW = (T)rasW * invSizeW;
|
||||||
|
m_RasLlX = m_PixPerImageUnitW * carLlX;
|
||||||
|
|
||||||
|
m_PixPerImageUnitH = (T)rasH * invSizeH;
|
||||||
|
m_RasLlY = m_PixPerImageUnitH * carLlY;
|
||||||
|
|
||||||
|
T m_OneRow = abs(m_CarUrY - m_CarLlY) / m_RasHeight;
|
||||||
|
T m_OneCol = abs(m_CarUrX - m_CarLlX) / m_RasWidth;
|
||||||
|
|
||||||
|
m_PadCarLlX = m_CarLlX + m_OneCol;
|
||||||
|
m_PadCarUrX = m_CarUrX - m_OneCol;
|
||||||
|
|
||||||
|
m_PadCarLlY = m_CarLlY + m_OneRow;
|
||||||
|
m_PadCarUrY = m_CarUrY - m_OneRow;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convert a cartesian x, y coordinate to a raster x, y coordinate.
|
||||||
|
/// This will flip the Y coordinate, so points that hit the bottom of the cartesian plane will
|
||||||
|
/// be mapped to the top of the histogram and vice versa.
|
||||||
|
/// There is a very slim chance that a point will be right on the border and will technically be in bounds, passing the InBounds() test,
|
||||||
|
/// but ends up being mapped to a histogram bucket that is out of bounds due to roundoff error. Perform an additional check after this call to make sure the
|
||||||
|
/// mapped point is in bounds.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="cartX">The cartesian x</param>
|
||||||
|
/// <param name="cartY">The cartesian y</param>
|
||||||
|
/// <param name="rasX">The converted raster x</param>
|
||||||
|
/// <param name="rasY">The converted raster y</param>
|
||||||
|
inline void Convert(T cartX, T cartY, unsigned int& rasX, unsigned int& rasY)
|
||||||
|
{
|
||||||
|
rasX = (unsigned int)(m_PixPerImageUnitW * cartX - m_RasLlX);
|
||||||
|
rasY = (unsigned int)(m_RasLlY - (m_PixPerImageUnitH * cartY));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convert a cartesian x, y coordinate to a single raster buffer index.
|
||||||
|
/// This will flip the Y coordinate, so points that hit the bottom of the cartesian plane will
|
||||||
|
/// be mapped to the top of the histogram and vice versa.
|
||||||
|
/// There is a very slim chance that a point will be right on the border and will technically be in bounds, passing the InBounds() test,
|
||||||
|
/// but ends up being mapped to a histogram bucket that is out of bounds due to roundoff error. Perform an additional check after this call to make sure the
|
||||||
|
/// mapped point is in bounds.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="cartX">The cartesian x</param>
|
||||||
|
/// <param name="cartY">The cartesian y</param>
|
||||||
|
/// <param name="singleBufferIndex">The converted single raster buffer index</param>
|
||||||
|
inline void Convert(T cartX, T cartY, unsigned int& singleBufferIndex)
|
||||||
|
{
|
||||||
|
singleBufferIndex = (unsigned int)(m_PixPerImageUnitW * cartX - m_RasLlX) + (m_RasWidth * (unsigned int)(m_PixPerImageUnitH * cartY - m_RasLlY));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convert a cartesian x, y point to a single raster buffer index.
|
||||||
|
/// This will flip the Y coordinate, so points that hit the bottom of the cartesian plane will
|
||||||
|
/// be mapped to the top of the histogram and vice versa.
|
||||||
|
/// This is the most efficient possible way of converting, consisting of only
|
||||||
|
/// a multiply and subtract per coordinate element.
|
||||||
|
/// There is a very slim chance that a point will be right on the border and will technically be in bounds, passing the InBounds() test,
|
||||||
|
/// but ends up being mapped to a histogram bucket that is out of bounds due to roundoff error. Perform an additional check after this call to make sure the
|
||||||
|
/// mapped point is in bounds.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="point">The cartesian y</param>
|
||||||
|
/// <param name="singleBufferIndex">The converted single raster buffer index</param>
|
||||||
|
inline void Convert(Point<T>& point, unsigned int& singleBufferIndex)
|
||||||
|
{
|
||||||
|
singleBufferIndex = (unsigned int)(m_PixPerImageUnitW * point.m_X - m_RasLlX) + (m_RasWidth * (unsigned int)(m_PixPerImageUnitH * point.m_Y - m_RasLlY));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determine if a point in the cartesian plane can be converted to a point within the raster plane.
|
||||||
|
/// There is a very slim chance that a point will be right on the border and will technically be in bounds, passing the InBounds() test,
|
||||||
|
/// but ends up being mapped to a histogram bucket that is out of bounds due to roundoff error. Perform an additional check after this call to make sure the
|
||||||
|
/// mapped point is in bounds.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="point">The point to test</param>
|
||||||
|
/// <returns>True if within bounds, else false</returns>
|
||||||
|
inline bool InBounds(Point<T>& point)
|
||||||
|
{
|
||||||
|
//Debug check for hitting the very first pixel in the image.
|
||||||
|
//if (point.m_Y > m_CarLlY && point.m_Y <= m_PadCarLlY && //Mapped to top row...
|
||||||
|
// point.m_X > m_CarLlX && point.m_X <= m_PadCarLlX)//...first col.
|
||||||
|
//{
|
||||||
|
// cout << "First pixel hit." << endl;
|
||||||
|
//}
|
||||||
|
|
||||||
|
return point.m_X >= m_CarLlX &&
|
||||||
|
point.m_X < m_CarUrX &&
|
||||||
|
point.m_Y < m_CarUrY &&
|
||||||
|
point.m_Y >= m_CarLlY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Accessors.
|
||||||
|
/// </summary>
|
||||||
|
inline unsigned int RasWidth() const { return m_RasWidth; }
|
||||||
|
inline unsigned int RasHeight() const { return m_RasHeight; }
|
||||||
|
inline T OneRow() const { return m_OneRow; }
|
||||||
|
inline T OneCol() const { return m_OneCol; }
|
||||||
|
inline T PixPerImageUnitW() const { return m_PixPerImageUnitW; }
|
||||||
|
inline T RasLlX() const { return m_RasLlX; }
|
||||||
|
inline T PixPerImageUnitH() const { return m_PixPerImageUnitH; }
|
||||||
|
inline T RasLlY() const { return m_RasLlY; }
|
||||||
|
inline T CarLlX() const { return m_CarLlX; }
|
||||||
|
inline T CarLlY() const { return m_CarLlY; }
|
||||||
|
inline T CarUrX() const { return m_CarUrX; }
|
||||||
|
inline T CarUrY() const { return m_CarUrY; }
|
||||||
|
inline T PadCarLlX() const { return m_PadCarLlX; }
|
||||||
|
inline T PadCarLlY() const { return m_PadCarLlY; }
|
||||||
|
inline T PadCarUrX() const { return m_PadCarUrX; }
|
||||||
|
inline T PadCarUrY() const { return m_PadCarUrY; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
unsigned int m_RasWidth, m_RasHeight;//The width and height of the raster image.
|
||||||
|
T m_OneRow;//The distance that one raster row represents in the cartesian plane.
|
||||||
|
T m_OneCol;//The distance that one raster column represents in the cartesian plane.
|
||||||
|
T m_PixPerImageUnitW;//The number of columns in the raster plane that a horizontal distance of 1 in the cartesian plane represents. The higher the number, the more zoomed in.
|
||||||
|
T m_RasLlX;//The lower left x of the raster image plane.
|
||||||
|
T m_PixPerImageUnitH;//The number of rows in the raster plane that a vertical distance of 1 in the cartesian plane represents. The higher the number, the more zoomed in.
|
||||||
|
T m_RasLlY;//The lower left y of the raster image plane.
|
||||||
|
T m_CarLlX, m_CarLlY, m_CarUrX, m_CarUrY;//The bounds of the cartesian plane.
|
||||||
|
T m_PadCarLlX, m_PadCarLlY, m_PadCarUrX, m_PadCarUrY;//The bounds of the cartesian plane padded by one raster row and column on each side.
|
||||||
|
};
|
||||||
|
}
|
340
Source/Ember/DensityFilter.h
Normal file
340
Source/Ember/DensityFilter.h
Normal file
@ -0,0 +1,340 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "SpatialFilter.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// DensityFilter class.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberNs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A base class with virtual functions to allow both templating and polymorphism to work together.
|
||||||
|
/// Derived classes will implement all of these functions.
|
||||||
|
/// </summary>
|
||||||
|
class EMBER_API DensityFilterBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DensityFilterBase() { }
|
||||||
|
virtual ~DensityFilterBase() { }
|
||||||
|
|
||||||
|
virtual int FilterWidth() { return 0; }
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The density estimation filter is used after iterating, but before final accumulation.
|
||||||
|
/// It's a variable width Gaussian filter, whose width is inversely proportional
|
||||||
|
/// to the number of hits a given histogram cell has received.
|
||||||
|
/// That means the fewer hits in a cell, the more blur is applied. The greater the hits,
|
||||||
|
/// the less blur.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API DensityFilter : public DensityFilterBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor that assigns various fields but does not create the actual filter vector.
|
||||||
|
/// This is done because filter creation could fail, so the user must manually call it
|
||||||
|
/// after construction.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="minRad">The minimum filter radius</param>
|
||||||
|
/// <param name="maxRad">The maximum filter radius</param>
|
||||||
|
/// <param name="curve">The curve of the filter</param>
|
||||||
|
/// <param name="supersample">The supersample of the ember this filter will be used with</param>
|
||||||
|
DensityFilter(T minRad, T maxRad, T curve, unsigned int supersample)
|
||||||
|
{
|
||||||
|
m_MinRad = minRad;
|
||||||
|
m_MaxRad = maxRad;
|
||||||
|
m_Curve = curve;
|
||||||
|
m_Supersample = supersample;
|
||||||
|
m_MaxFilterIndex = 0;
|
||||||
|
|
||||||
|
//Make sure the values make sense.
|
||||||
|
if (m_Curve <= 0.0)
|
||||||
|
m_Curve = T(0.5);
|
||||||
|
|
||||||
|
if (m_MaxRad < m_MinRad)
|
||||||
|
m_MaxRad = m_MinRad + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copy constructor.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filter">The DensityFilter object to copy</param>
|
||||||
|
DensityFilter(const DensityFilter<T>& filter)
|
||||||
|
{
|
||||||
|
*this = filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Assignment operator.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filter">The DensityFilter object to copy.</param>
|
||||||
|
/// <returns>Reference to updated self</returns>
|
||||||
|
DensityFilter<T>& operator = (const DensityFilter<T>& filter)
|
||||||
|
{
|
||||||
|
if (this != &filter)
|
||||||
|
{
|
||||||
|
m_MinRad = filter.m_MinRad;
|
||||||
|
m_MaxRad = filter.m_MaxRad;
|
||||||
|
m_Curve = filter.m_Curve;
|
||||||
|
m_Supersample = filter.m_Supersample;
|
||||||
|
m_KernelSize = filter.m_KernelSize;
|
||||||
|
m_MaxFilterIndex = filter.m_MaxFilterIndex;
|
||||||
|
m_MaxFilteredCounts = filter.m_MaxFilteredCounts;
|
||||||
|
m_FilterWidth = filter.m_FilterWidth;
|
||||||
|
m_Coefs = filter.m_Coefs;
|
||||||
|
m_Widths = filter.m_Widths;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create the filter vector of up to 10M entries.
|
||||||
|
/// If more than that are requested, it isn't created and
|
||||||
|
/// false is returned.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>True if success, else false.</returns>
|
||||||
|
bool Create()
|
||||||
|
{
|
||||||
|
int i, j, w;
|
||||||
|
int intFilterCount, maxIndex;
|
||||||
|
int rowSize;
|
||||||
|
int filterLoop;
|
||||||
|
int keepThresh = 100;
|
||||||
|
unsigned int filterCoefIndex = 0;
|
||||||
|
T decFilterCount;
|
||||||
|
T finalMinRad = m_MinRad * m_Supersample + 1;//Should scale the filter width by the oversample.
|
||||||
|
T finalMaxRad = m_MaxRad * m_Supersample + 1;//The '+1' comes from the assumed distance to the first pixel.
|
||||||
|
GaussianFilter<T> gaussianFilter(m_MaxRad, m_Supersample);
|
||||||
|
|
||||||
|
m_KernelSize = 0;
|
||||||
|
m_MaxFilterIndex = 0;
|
||||||
|
|
||||||
|
//Calculate how many filter kernels are needed based on the decay function
|
||||||
|
//
|
||||||
|
// num filters = (de_max_width / de_min_width)^(1 / estimator_curve)
|
||||||
|
//
|
||||||
|
decFilterCount = pow(finalMaxRad / finalMinRad, T(1.0) / m_Curve);
|
||||||
|
|
||||||
|
if (decFilterCount > 1e7)//Too many filters.
|
||||||
|
return false;
|
||||||
|
|
||||||
|
intFilterCount = (int)ceil(decFilterCount);
|
||||||
|
|
||||||
|
//Condense the smaller kernels to save space.
|
||||||
|
if (intFilterCount > keepThresh)
|
||||||
|
{
|
||||||
|
maxIndex = (int)ceil(DE_THRESH + pow(T(intFilterCount - DE_THRESH), m_Curve)) + 1;
|
||||||
|
m_MaxFilteredCounts = (int)pow(T(maxIndex - DE_THRESH), T(1.0) / m_Curve) + DE_THRESH;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
maxIndex = intFilterCount;
|
||||||
|
m_MaxFilteredCounts = maxIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Allocate the memory for these filters and the hit/width lookup array.
|
||||||
|
rowSize = (int)(2 * ceil(finalMaxRad) - 1);
|
||||||
|
m_FilterWidth = (rowSize - 1) / 2;
|
||||||
|
m_KernelSize = (m_FilterWidth + 1) * (2 + m_FilterWidth) / 2;
|
||||||
|
|
||||||
|
m_Coefs.resize(maxIndex * m_KernelSize);
|
||||||
|
m_Widths.resize(maxIndex);
|
||||||
|
|
||||||
|
//Generate the filter coefficients.
|
||||||
|
for (filterLoop = 0; filterLoop < maxIndex; filterLoop++)
|
||||||
|
{
|
||||||
|
int dej, dek;
|
||||||
|
int coefIndex;
|
||||||
|
T filterSum = 0.0;
|
||||||
|
T filterVal;
|
||||||
|
T filterHeight;
|
||||||
|
T loopAdjust;
|
||||||
|
|
||||||
|
//Calculate the filter width for this number of hits in a bin.
|
||||||
|
if (filterLoop < keepThresh)
|
||||||
|
{
|
||||||
|
filterHeight = (finalMaxRad / pow(T(filterLoop + 1), m_Curve));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
loopAdjust = pow(T(filterLoop - keepThresh), (T(1.0) / m_Curve)) + keepThresh;
|
||||||
|
filterHeight = (finalMaxRad / pow(loopAdjust + 1, m_Curve));
|
||||||
|
}
|
||||||
|
|
||||||
|
//Once we've reached the min radius, don't populate any more.
|
||||||
|
if (filterHeight <= finalMinRad)
|
||||||
|
{
|
||||||
|
filterHeight = finalMinRad;
|
||||||
|
m_MaxFilterIndex = filterLoop;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_Widths[filterLoop] = filterHeight;
|
||||||
|
|
||||||
|
//Calculate norm of kernel separately (easier).
|
||||||
|
for (dej = -m_FilterWidth; dej <= m_FilterWidth; dej++)
|
||||||
|
{
|
||||||
|
for (dek = -m_FilterWidth; dek <= m_FilterWidth; dek++)
|
||||||
|
{
|
||||||
|
filterVal = sqrt((T)(dej * dej + dek * dek)) / filterHeight;
|
||||||
|
|
||||||
|
//Only populate the coefs within this radius.
|
||||||
|
if (filterVal <= 1.0)
|
||||||
|
filterSum += gaussianFilter.Filter(gaussianFilter.Support() * filterVal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
coefIndex = filterLoop * m_KernelSize;
|
||||||
|
|
||||||
|
//Calculate the unique entries of the kernel.
|
||||||
|
for (dej = 0; dej <= m_FilterWidth; dej++)
|
||||||
|
{
|
||||||
|
for (dek = 0; dek <= dej; dek++)
|
||||||
|
{
|
||||||
|
filterVal = sqrt(T(dej * dej + dek * dek)) / filterHeight;
|
||||||
|
|
||||||
|
//Only populate the coefs within this radius.
|
||||||
|
if (filterVal > 1.0)
|
||||||
|
m_Coefs[coefIndex] = 0.0;
|
||||||
|
else
|
||||||
|
m_Coefs[coefIndex] = gaussianFilter.Filter(gaussianFilter.Support() * filterVal) / filterSum;
|
||||||
|
|
||||||
|
coefIndex++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_MaxFilterIndex > 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_MaxFilterIndex == 0)
|
||||||
|
m_MaxFilterIndex = maxIndex - 1;
|
||||||
|
|
||||||
|
w = m_FilterWidth + 1;
|
||||||
|
m_CoefIndices.resize(w * w);
|
||||||
|
|
||||||
|
//This will populate one quadrant of filter indices.
|
||||||
|
//Really only need 1/8th, but that would require a sparse matrix.
|
||||||
|
for (j = 0; j <= m_FilterWidth; j++)
|
||||||
|
{
|
||||||
|
for (i = 0; i <= j; i++, filterCoefIndex++)
|
||||||
|
{
|
||||||
|
if (j == 0 && i == 0)
|
||||||
|
{
|
||||||
|
m_CoefIndices[(j * w) + i] = filterCoefIndex;
|
||||||
|
}
|
||||||
|
else if (i == 0)
|
||||||
|
{
|
||||||
|
m_CoefIndices[(0 * w) + j] = filterCoefIndex;
|
||||||
|
m_CoefIndices[(j * w) + 0] = filterCoefIndex;
|
||||||
|
}
|
||||||
|
else if (j == i)
|
||||||
|
{
|
||||||
|
m_CoefIndices[(j * w) + i] = filterCoefIndex;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_CoefIndices[(i * w) + j] = filterCoefIndex;
|
||||||
|
m_CoefIndices[(j * w) + i] = filterCoefIndex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return whether the requested dimensions are valid.
|
||||||
|
/// Meaning, is the requested filter size less than or equal to 10M?
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>True if requested filter size is less than or equal to 10M, else false.</returns>
|
||||||
|
inline bool Valid() const
|
||||||
|
{
|
||||||
|
T finalMaxRad = m_MaxRad * m_Supersample + 1;
|
||||||
|
T finalMinRad = m_MinRad * m_Supersample + 1;
|
||||||
|
|
||||||
|
return pow(finalMaxRad / finalMinRad, T(1.0) / m_Curve) <= 1e7;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return a string representation of this density estimation filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The string representation of this density estimation filter</returns>
|
||||||
|
string ToString() const
|
||||||
|
{
|
||||||
|
unsigned int i, j, coefIndex = 0, w = m_FilterWidth + 1;
|
||||||
|
stringstream ss;
|
||||||
|
|
||||||
|
ss
|
||||||
|
<< "Density Filter:" << endl
|
||||||
|
<< " Min radius: " << MinRad() << endl
|
||||||
|
<< " Max radius: " << MaxRad() << endl
|
||||||
|
<< " Curve: " << Curve() << endl
|
||||||
|
<< " Kernel size: " << KernelSize() << endl
|
||||||
|
<< " Max filter index: " << MaxFilterIndex() << endl
|
||||||
|
<< "Max Filtered counts: " << MaxFilteredCounts() << endl
|
||||||
|
<< " Filter width: " << FilterWidth() << endl;
|
||||||
|
|
||||||
|
ss << "Coefficients: " << endl;
|
||||||
|
|
||||||
|
for (i = 0; i < m_Widths.size(); i++)
|
||||||
|
{
|
||||||
|
for (coefIndex = 0; coefIndex < m_KernelSize; coefIndex++)
|
||||||
|
ss << "Kernel[" << i << "].Coefs[" << coefIndex << "]: " << m_Coefs[(i * m_KernelSize) + coefIndex] << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
ss << endl << "Widths: " << endl;
|
||||||
|
|
||||||
|
for (i = 0; i < m_Widths.size(); i++)
|
||||||
|
{
|
||||||
|
ss << "Widths[" << i << "]: " << m_Widths[i] << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < w; i++)
|
||||||
|
{
|
||||||
|
for (j = 0; j < w; j++)
|
||||||
|
{
|
||||||
|
cout << std::setw(2) << std::setfill('0') << m_CoefIndices[i * w + j] << "\t";
|
||||||
|
}
|
||||||
|
|
||||||
|
cout << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Accessors.
|
||||||
|
/// </summary>
|
||||||
|
inline T MinRad() const { return m_MinRad; }
|
||||||
|
inline T MaxRad() const { return m_MaxRad; }
|
||||||
|
inline T Curve() const { return m_Curve; }
|
||||||
|
inline unsigned int KernelSize() const { return m_KernelSize; }
|
||||||
|
inline unsigned int MaxFilterIndex() const { return m_MaxFilterIndex; }
|
||||||
|
inline unsigned int MaxFilteredCounts() const { return m_MaxFilteredCounts; }
|
||||||
|
virtual int FilterWidth() const { return m_FilterWidth; }
|
||||||
|
inline unsigned int BufferSize() const { return (unsigned int)m_Widths.size(); }
|
||||||
|
inline unsigned int CoefsSizeBytes() const { return BufferSize() * m_KernelSize * sizeof(T); }
|
||||||
|
inline unsigned int WidthsSizeBytes() const { return BufferSize() * sizeof(T); }
|
||||||
|
inline unsigned int CoefsIndicesSizeBytes() const { return unsigned int(m_CoefIndices.size() * sizeof(unsigned int)); }
|
||||||
|
inline const T* Coefs() const { return m_Coefs.data(); }
|
||||||
|
inline const T* Widths() const { return m_Widths.data(); }
|
||||||
|
inline const unsigned int* CoefIndices() const { return m_CoefIndices.data(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
T m_MinRad;
|
||||||
|
T m_MaxRad;//The original specified filter radius.
|
||||||
|
T m_Curve;
|
||||||
|
unsigned int m_Supersample;
|
||||||
|
unsigned int m_KernelSize;
|
||||||
|
unsigned int m_MaxFilterIndex;
|
||||||
|
unsigned int m_MaxFilteredCounts;
|
||||||
|
int m_FilterWidth;//The new radius after scaling for super sample and rounding. This is what's actually used.
|
||||||
|
vector<T> m_Coefs;
|
||||||
|
vector<T> m_Widths;
|
||||||
|
vector<unsigned int> m_CoefIndices;
|
||||||
|
};
|
||||||
|
}
|
20
Source/Ember/DllMain.cpp
Normal file
20
Source/Ember/DllMain.cpp
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#include "EmberPch.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Generated by Visual Studio to make the DLL run properly.
|
||||||
|
/// </summary>
|
||||||
|
BOOL APIENTRY DllMain( HMODULE hModule,
|
||||||
|
DWORD ul_reason_for_call,
|
||||||
|
LPVOID lpReserved
|
||||||
|
)
|
||||||
|
{
|
||||||
|
switch (ul_reason_for_call)
|
||||||
|
{
|
||||||
|
case DLL_PROCESS_ATTACH:
|
||||||
|
case DLL_THREAD_ATTACH:
|
||||||
|
case DLL_THREAD_DETACH:
|
||||||
|
case DLL_PROCESS_DETACH:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
410
Source/Ember/Ember.cpp
Normal file
410
Source/Ember/Ember.cpp
Normal file
@ -0,0 +1,410 @@
|
|||||||
|
#include "EmberPch.h"
|
||||||
|
#include "EmberDefines.h"
|
||||||
|
#include "Isaac.h"
|
||||||
|
#include "Ember.h"
|
||||||
|
#include "Utils.h"
|
||||||
|
#include "Iterator.h"
|
||||||
|
#include "Palette.h"
|
||||||
|
#include "PaletteList.h"
|
||||||
|
#include "Point.h"
|
||||||
|
#include "Variation.h"
|
||||||
|
#include "Variations01.h"
|
||||||
|
#include "Variations02.h"
|
||||||
|
#include "Variations03.h"
|
||||||
|
#include "Variations04.h"
|
||||||
|
#include "Variations05.h"
|
||||||
|
#include "VariationsDC.h"
|
||||||
|
#include "VariationList.h"
|
||||||
|
#include "Affine2D.h"
|
||||||
|
#include "Xform.h"
|
||||||
|
#include "EmberToXml.h"
|
||||||
|
#include "XmlToEmber.h"
|
||||||
|
#include "SpatialFilter.h"
|
||||||
|
#include "DensityFilter.h"
|
||||||
|
#include "TemporalFilter.h"
|
||||||
|
#include "Interpolate.h"
|
||||||
|
#include "Renderer.h"
|
||||||
|
#include "Timing.h"
|
||||||
|
#include "SheepTools.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Explicit instantiation of all templated classes which aren't implemented in cpp files.
|
||||||
|
/// All new templated classes, such as new variations, must be added here.
|
||||||
|
/// Additional instances of static class member variables.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberNs
|
||||||
|
{
|
||||||
|
bool Timing::m_TimingInit = false;
|
||||||
|
int Timing::m_ProcessorCount;
|
||||||
|
LARGE_INTEGER Timing::m_Freq;
|
||||||
|
auto_ptr<QTIsaac<ISAAC_SIZE, ISAAC_INT>> QTIsaac<ISAAC_SIZE, ISAAC_INT>::GlobalRand = auto_ptr<QTIsaac<ISAAC_SIZE, ISAAC_INT>>(new QTIsaac<ISAAC_SIZE, ISAAC_INT>());
|
||||||
|
|
||||||
|
#define EXPORTPREPOSTREGVAR(varName, T) \
|
||||||
|
template EMBER_API class varName##Variation<T>; \
|
||||||
|
template EMBER_API class Pre##varName##Variation<T>; \
|
||||||
|
template EMBER_API class Post##varName##Variation<T>;
|
||||||
|
|
||||||
|
#define EXPORT_SINGLE_TYPE_EMBER(T) \
|
||||||
|
template EMBER_API class Point<T>; \
|
||||||
|
template EMBER_API class Color<T>; \
|
||||||
|
template EMBER_API class Affine2D<T>; \
|
||||||
|
template EMBER_API class Palette<T>; \
|
||||||
|
template EMBER_API class PaletteList<T>; \
|
||||||
|
template EMBER_API class Iterator<T>; \
|
||||||
|
template EMBER_API class StandardIterator<T>; \
|
||||||
|
template EMBER_API class XaosIterator<T>; \
|
||||||
|
template EMBER_API class Xform<T>; \
|
||||||
|
template EMBER_API class IteratorHelper<T>; \
|
||||||
|
template EMBER_API class Variation<T>; \
|
||||||
|
template EMBER_API class ParamWithName<T>; \
|
||||||
|
template EMBER_API class ParametricVariation<T>; \
|
||||||
|
EXPORTPREPOSTREGVAR(Linear, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Sinusoidal, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Spherical, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Swirl, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Horseshoe, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Polar, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Handkerchief, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Heart, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Disc, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Spiral, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Hyperbolic, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Diamond, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Ex, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Julia, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Bent, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Waves, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Fisheye, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Popcorn, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Exponential, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Power, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Cosine, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Rings, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Fan, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Blob, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Pdj, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Fan2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Rings2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Eyefish, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Bubble, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Cylinder, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Perspective, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Noise, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(JuliaNGeneric, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(JuliaScope, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Blur, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(GaussianBlur, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(RadialBlur, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Pie, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Ngon, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Curl, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Rectangles, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Arch, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Tangent, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Square, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Rays, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Blade, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Secant2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(TwinTrian, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Cross, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Disc2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(SuperShape, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Flower, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Conic, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Parabola, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Bent2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Bipolar, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Boarders, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Butterfly, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Cell, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Cpow, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Curve, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Edisc, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Elliptic, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Escher, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Foci, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(LazySusan, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Loonie, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Modulus, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Oscilloscope, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Polar2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Popcorn2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Scry, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Separation, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Split, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Splits, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Stripes, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Wedge, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(WedgeJulia, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(WedgeSph, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Whorl, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Waves2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Exp, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Log, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Sin, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Cos, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Tan, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Sec, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Csc, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Cot, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Sinh, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Cosh, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Tanh, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Sech, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Csch, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Coth, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Auger, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Flux, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Hemisphere, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Epispiral, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Bwraps, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Extrude, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(BlurCircle, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(BlurZoom, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(BlurPixelize, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Crop, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(BCircle, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(BlurLinear, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(BlurSquare, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Boarders2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Cardioid, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Checks, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Circlize, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Circlize2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(CosWrap, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(DeltaA, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Expo, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(FDisc, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Fibonacci, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Fibonacci2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Glynnia, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(GridOut, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Hole, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Hypertile, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Hypertile1, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Hypertile2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Hypertile3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Hypertile3D1, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Hypertile3D2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(IDisc, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Julian2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(JuliaQ, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Murl, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Murl2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(NPolar, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Ortho, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Poincare, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Poincare3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Polynomial, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(PSphere, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Rational3, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Ripple, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Sigmoid, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(SinusGrid, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Stwin, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(TwoFace, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Unpolar, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(WavesN, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(XHeart, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Barycentroid, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(BiSplit, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Crescents, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Mask, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Cpow2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Curl3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Disc3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Funnel, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Linear3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(PowBlock, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Squirrel, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Ennepers, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(SphericalN, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Kaleidoscope, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(GlynnSim1, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(GlynnSim2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(GlynnSim3, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Starblur, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Sineblur, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Circleblur, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(CropN, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(ShredRad, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Blob2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Julia3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Julia3Dz, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(LinearT, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(LinearT3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Ovoid, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Ovoid3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Spirograph, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Petal, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(RoundSpher, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(RoundSpher3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(SpiralWing, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Squarize, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Sschecks, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(PhoenixJulia, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Mobius, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(MobiusN, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(MobiusStrip, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Lissajous, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Svf, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Target, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Taurus, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Collideoscope, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(BMod, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(BSwirl, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(BTransform, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(BCollide, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Eclipse, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(FlipCircle, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(FlipY, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(ECollide, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(EJulia, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(EMod, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(EMotion, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(EPush, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(ERotate, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(EScale, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(ESwirl, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(LazyTravis, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Squish, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Circus, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Tancos, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Rippled, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Flatten, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Zblur, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Blur3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(ZScale, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(ZTranslate, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(ZCone, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Boarders2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(RotateX, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(RotateY, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(RotateZ, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(MirrorX, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(MirrorY, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(MirrorZ, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Depth, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(RBlur, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(JuliaNab, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Sintrange, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Voron, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Waffle, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Square3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(SuperShape3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Sphyp3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Circlecrop, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Julian3Dx, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Fourth, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Mobiq, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Spherivoid, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Farblur, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(CurlSP, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Heat, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Interference2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Sinq, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Sinhq, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Secq, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Sechq, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Tanq, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Tanhq, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Cosq, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Coshq, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Cotq, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Cothq, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Cscq, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Cschq, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Estiq, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Loq, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Curvature, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Qode, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(BlurHeart, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Truchet, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Gdoffs, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Octagon, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Trade, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Juliac, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Blade3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Blob3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Blocky, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Bubble2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(CircleLinear, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(CircleRand, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(CircleTrans1, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Cubic3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(CubicLattice3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Foci3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Ho, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Julia3Dq, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Line, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Loonie3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Mcarpet, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Waves23D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Pie3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Popcorn23D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Sinusoidal3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Scry3D, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Shredlin, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(SplitBrdr, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Wdisc, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Falloff, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Falloff2, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Falloff3, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(Xtrb, T) \
|
||||||
|
template EMBER_API class DCBubbleVariation<T>; \
|
||||||
|
EXPORTPREPOSTREGVAR(DCCarpet, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(DCCube, T) \
|
||||||
|
template EMBER_API class DCCylinderVariation<T>; \
|
||||||
|
EXPORTPREPOSTREGVAR(DCGridOut, T) \
|
||||||
|
template EMBER_API class DCLinearVariation<T>; \
|
||||||
|
EXPORTPREPOSTREGVAR(DCZTransl, T) \
|
||||||
|
EXPORTPREPOSTREGVAR(DCTriangle, T) \
|
||||||
|
template EMBER_API class VariationList<T>; \
|
||||||
|
template EMBER_API class SpatialFilter<T>; \
|
||||||
|
template EMBER_API class GaussianFilter<T>; \
|
||||||
|
template EMBER_API class HermiteFilter<T>; \
|
||||||
|
template EMBER_API class BoxFilter<T>; \
|
||||||
|
template EMBER_API class TriangleFilter<T>; \
|
||||||
|
template EMBER_API class BellFilter<T>; \
|
||||||
|
template EMBER_API class BsplineFilter<T>; \
|
||||||
|
template EMBER_API class MitchellFilter<T>; \
|
||||||
|
template EMBER_API class BlackmanFilter<T>; \
|
||||||
|
template EMBER_API class CatromFilter<T>; \
|
||||||
|
template EMBER_API class HanningFilter<T>; \
|
||||||
|
template EMBER_API class HammingFilter<T>; \
|
||||||
|
template EMBER_API class Lanczos3Filter<T>; \
|
||||||
|
template EMBER_API class Lanczos2Filter<T>; \
|
||||||
|
template EMBER_API class QuadraticFilter<T>; \
|
||||||
|
template EMBER_API class DensityFilter<T>; \
|
||||||
|
template EMBER_API class TemporalFilter<T>; \
|
||||||
|
template EMBER_API class ExpTemporalFilter<T>; \
|
||||||
|
template EMBER_API class GaussianTemporalFilter<T>; \
|
||||||
|
template EMBER_API class BoxTemporalFilter<T>; \
|
||||||
|
template EMBER_API class SpatialFilterCreator<T>; \
|
||||||
|
template EMBER_API class TemporalFilterCreator<T>; \
|
||||||
|
template EMBER_API class Interpolater<T>; \
|
||||||
|
template EMBER_API class Ember<T>; \
|
||||||
|
/*template EMBER_API class RenderCallback<T>;*/ \
|
||||||
|
template EMBER_API class CarToRas<T>; \
|
||||||
|
template EMBER_API class XmlToEmber<T>; \
|
||||||
|
template EMBER_API class EmberToXml<T>; \
|
||||||
|
bool PaletteList<T>::m_Init = false; \
|
||||||
|
vector<Palette<T>> PaletteList<T>::m_Palettes = vector<Palette<T>>(); \
|
||||||
|
bool XmlToEmber<T>::m_Init = false; \
|
||||||
|
vector<pair<string, string>> XmlToEmber<T>::m_BadParamNames = vector<pair<string, string>>(); \
|
||||||
|
vector<pair<string, string>> XmlToEmber<T>::m_BadVariationNames = vector<pair<string, string>>();
|
||||||
|
|
||||||
|
EXPORT_SINGLE_TYPE_EMBER(float)
|
||||||
|
|
||||||
|
#define EXPORT_TWO_TYPE_EMBER(T, bucketT) \
|
||||||
|
template EMBER_API class Renderer<T, bucketT>; \
|
||||||
|
template EMBER_API class SheepTools<T, bucketT>;
|
||||||
|
|
||||||
|
EXPORT_TWO_TYPE_EMBER(float, float)
|
||||||
|
|
||||||
|
#ifdef DO_DOUBLE
|
||||||
|
EXPORT_SINGLE_TYPE_EMBER(double)
|
||||||
|
EXPORT_TWO_TYPE_EMBER(double, double)
|
||||||
|
#endif
|
||||||
|
}
|
1607
Source/Ember/Ember.h
Normal file
1607
Source/Ember/Ember.h
Normal file
File diff suppressed because it is too large
Load Diff
83
Source/Ember/EmberDefines.h
Normal file
83
Source/Ember/EmberDefines.h
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "EmberPch.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Basic #defines used throughout the library.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
//MSVC specific?
|
||||||
|
#if defined(BUILDING_EMBER)
|
||||||
|
#define EMBER_API __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define EMBER_API __declspec(dllimport)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define RESTRICT __restrict//This might make things faster, unsure if it really does though.
|
||||||
|
//#define RESTRICT
|
||||||
|
|
||||||
|
namespace EmberNs
|
||||||
|
{
|
||||||
|
//Wrap the sincos function for Macs and PC.
|
||||||
|
#if defined(__APPLE__) || defined(_MSC_VER)
|
||||||
|
#define sincos(x, s, c) *(s)=sin(x); *(c)=cos(x);
|
||||||
|
#else
|
||||||
|
extern void sincos(double x, double *s, double *c);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define EMBER_VERSION "0.4.0.2"
|
||||||
|
#define EPS6 T(1e-6)
|
||||||
|
#define EPS T(1e-10)//Apoplugin.h uses -20, but -10 seems to work fine.
|
||||||
|
#define ISAAC_SIZE 4
|
||||||
|
#define MEMALIGN 32
|
||||||
|
#define DE_THRESH 100
|
||||||
|
#define MAX_VARS_PER_XFORM 8
|
||||||
|
#define DEG_2_RAD (M_PI / 180)
|
||||||
|
#define RAD_2_DEG (180 / M_PI)
|
||||||
|
#define DEG_2_RAD_T (T(M_PI) / T(180))
|
||||||
|
#define RAD_2_DEG_T (T(180) / T(M_PI))
|
||||||
|
#define M_2PI (T(M_PI * 2))
|
||||||
|
#define M_3PI (T(M_PI * 3))
|
||||||
|
#define SQRT5 T(2.2360679774997896964091736687313)
|
||||||
|
#define M_PHI T(1.61803398874989484820458683436563)
|
||||||
|
#define COLORMAP_LENGTH 256//These will need to change if 2D palette support is ever added, or variable sized palettes.
|
||||||
|
#define COLORMAP_LENGTH_MINUS_1 255
|
||||||
|
#define WHITE 255
|
||||||
|
#define XC (const xmlChar*)
|
||||||
|
#define BadVal(x) (((x) != (x)) || ((x) > 1e10) || ((x) < -1e10))
|
||||||
|
#define Rint(A) floor((A) + (((A) < 0) ? T(-0.5) : T(0.5)))
|
||||||
|
#define Vlen(x) (sizeof(x) / sizeof(*x))
|
||||||
|
#define SQR(x) ((x) * (x))
|
||||||
|
#define CUBE(x) ((x) * (x) * (x))
|
||||||
|
#define TLOW std::numeric_limits<T>::lowest()
|
||||||
|
#define TMAX std::numeric_limits<T>::max()
|
||||||
|
|
||||||
|
#ifndef acosh
|
||||||
|
#define acosh(x) (log(x + sqrt(SQR(x) - 1)))//Remove this once you upgrade compilers to VS 2013 or later.//TODO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef fma
|
||||||
|
#define fma(x, y, z) ((x * y) + z)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define DO_DOUBLE 1//Comment this out for shorter build times during development. Always uncomment for release.
|
||||||
|
|
||||||
|
#define v2T glm::detail::tvec2<T, glm::defaultp>
|
||||||
|
#define v3T glm::detail::tvec3<T, glm::defaultp>
|
||||||
|
#define v4T glm::detail::tvec4<T, glm::defaultp>
|
||||||
|
#define m2T glm::detail::tmat2x2<T, glm::defaultp>
|
||||||
|
#define m3T glm::detail::tmat3x3<T, glm::defaultp>
|
||||||
|
#define m4T glm::detail::tmat4x4<T, glm::defaultp>
|
||||||
|
#define m23T glm::detail::tmat2x3<T, glm::defaultp>
|
||||||
|
|
||||||
|
enum eInterp : unsigned int { EMBER_INTERP_LINEAR = 0, EMBER_INTERP_SMOOTH = 1 };
|
||||||
|
enum eAffineInterp : unsigned int { INTERP_LINEAR = 0, INTERP_LOG = 1, INTERP_COMPAT = 2, INTERP_OLDER = 3 };
|
||||||
|
enum ePaletteMode : unsigned int { PALETTE_STEP = 0, PALETTE_LINEAR = 1 };
|
||||||
|
enum ePaletteInterp : unsigned int { INTERP_HSV = 0, INTERP_SWEEP = 1 };
|
||||||
|
enum eMotion : unsigned int { MOTION_SIN = 1, MOTION_TRIANGLE = 2, MOTION_HILL = 3 };
|
||||||
|
enum eProcessAction : unsigned int { NOTHING = 0, ACCUM_ONLY = 1, FILTER_AND_ACCUM = 2, KEEP_ITERATING = 3, FULL_RENDER = 4 };
|
||||||
|
enum eProcessState : unsigned int { NONE = 0, ITER_STARTED = 1, ITER_DONE = 2, FILTER_DONE = 3, ACCUM_DONE = 4 };
|
||||||
|
enum eInteractiveFilter : unsigned int { FILTER_LOG = 0, FILTER_DE = 1 };
|
||||||
|
enum eScaleType : unsigned int { SCALE_NONE = 0, SCALE_WIDTH = 1, SCALE_HEIGHT = 2 };
|
||||||
|
enum eRenderStatus : unsigned int { RENDER_OK = 0, RENDER_ERROR = 1, RENDER_ABORT = 2 };
|
||||||
|
}
|
1
Source/Ember/EmberPch.cpp
Normal file
1
Source/Ember/EmberPch.cpp
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "EmberPch.h"
|
62
Source/Ember/EmberPch.h
Normal file
62
Source/Ember/EmberPch.h
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Precompiled header file. Place all system includes here with appropriate #defines for different operating systems and compilers.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
#define NOMINMAX
|
||||||
|
#define _USE_MATH_DEFINES
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define basename(x) _strdup(x)
|
||||||
|
#define snprintf _snprintf
|
||||||
|
#define snprintf_s _snprintf_s
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#define EMBER_OS "WIN"
|
||||||
|
|
||||||
|
#include <SDKDDKVer.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#elif __APPLE__
|
||||||
|
#define EMBER_OS "OSX"
|
||||||
|
#else
|
||||||
|
#include <libgen.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#define EMBER_OS "LNX"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Standard headers.
|
||||||
|
#include <algorithm>
|
||||||
|
#include <complex>
|
||||||
|
#include <fstream>
|
||||||
|
#include <functional>
|
||||||
|
#include <iostream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <limits>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <numeric>
|
||||||
|
#include <ostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
//Third party headers.
|
||||||
|
#include <libxml/parser.h>
|
||||||
|
|
||||||
|
//Intel's Threading Building Blocks is what's used for all threading.
|
||||||
|
#include "tbb/task_group.h"
|
||||||
|
#include "tbb/parallel_for.h"
|
||||||
|
#include "tbb/task_scheduler_init.h"
|
||||||
|
|
||||||
|
#define GLM_FORCE_RADIANS
|
||||||
|
|
||||||
|
//glm is what's used for matrix math.
|
||||||
|
#include "glm/glm.hpp"
|
||||||
|
#include "glm/gtc/matrix_transform.hpp"
|
||||||
|
#include "glm/gtc/type_ptr.hpp"
|
||||||
|
#include "glm/gtx/string_cast.hpp"
|
||||||
|
|
||||||
|
using namespace tbb;
|
||||||
|
using namespace std;
|
686
Source/Ember/EmberToXml.h
Normal file
686
Source/Ember/EmberToXml.h
Normal file
@ -0,0 +1,686 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Utils.h"
|
||||||
|
#include "PaletteList.h"
|
||||||
|
#include "VariationList.h"
|
||||||
|
#include "Ember.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// EmberToXml class.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberNs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Class for converting ember objects to Xml documents.
|
||||||
|
/// Support for saving one or more to a single file.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API EmberToXml : public EmberReport
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Empty constructor.
|
||||||
|
/// </summary>
|
||||||
|
EmberToXml()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Save the ember to the specified file.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filename">Full path and filename</param>
|
||||||
|
/// <param name="ember">The ember to save</param>
|
||||||
|
/// <param name="printEditDepth">How deep the edit depth goes</param>
|
||||||
|
/// <param name="doEdits">If true included edit tags, else don't.</param>
|
||||||
|
/// <param name="intPalette">If true use integers instead of floating point numbers when embedding a non-hex formatted palette, else use floating point numbers.</param>
|
||||||
|
/// <param name="hexPalette">If true, embed a hexadecimal palette instead of Xml Color tags, else use Xml color tags.</param>
|
||||||
|
/// <param name="append">If true, append to the file if it already exists, else create a new file.</param>
|
||||||
|
/// <param name="start">Whether a new file is to be started</param>
|
||||||
|
/// <param name="finish">Whether an existing file is to be ended</param>
|
||||||
|
/// <returns>True if successful, else false</returns>
|
||||||
|
bool Save(string filename, Ember<T>& ember, unsigned int printEditDepth, bool doEdits, bool intPalette, bool hexPalette, bool append = false, bool start = false, bool finish = false)
|
||||||
|
{
|
||||||
|
vector<Ember<T>> vec;
|
||||||
|
|
||||||
|
vec.push_back(ember);
|
||||||
|
return Save(filename, vec, printEditDepth, doEdits, intPalette, hexPalette, append, start, finish);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Save a vector of embers to the specified file.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filename">Full path and filename</param>
|
||||||
|
/// <param name="embers">The vector of embers to save</param>
|
||||||
|
/// <param name="printEditDepth">How deep the edit depth goes</param>
|
||||||
|
/// <param name="doEdits">If true included edit tags, else don't.</param>
|
||||||
|
/// <param name="intPalette">If true use integers instead of floating point numbers when embedding a non-hex formatted palette, else use floating point numbers.</param>
|
||||||
|
/// <param name="hexPalette">If true, embed a hexadecimal palette instead of Xml Color tags, else use Xml color tags.</param>
|
||||||
|
/// <param name="append">If true, append to the file if it already exists, else create a new file.</param>
|
||||||
|
/// <param name="start">Whether a new file is to be started</param>
|
||||||
|
/// <param name="finish">Whether an existing file is to be ended</param>
|
||||||
|
/// <returns>True if successful, else false</returns>
|
||||||
|
bool Save(string filename, vector<Ember<T>>& embers, unsigned int printEditDepth, bool doEdits, bool intPalette, bool hexPalette, bool append = false, bool start = false, bool finish = false)
|
||||||
|
{
|
||||||
|
bool b = false;
|
||||||
|
string temp;
|
||||||
|
ofstream f;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (append)
|
||||||
|
f.open(filename, std::ofstream::out | std::ofstream::app);//Appending allows us to write multiple embers to a single file.
|
||||||
|
else
|
||||||
|
f.open(filename);
|
||||||
|
|
||||||
|
if (f.is_open())
|
||||||
|
{
|
||||||
|
if ((append && start) || !append)
|
||||||
|
{
|
||||||
|
temp = "<flames>\n";
|
||||||
|
f.write(temp.c_str(), temp.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < embers.size(); i++)
|
||||||
|
{
|
||||||
|
string s = ToString(embers[i], "", printEditDepth, doEdits, intPalette, hexPalette);
|
||||||
|
f.write(s.c_str(), s.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((append && finish) || !append)
|
||||||
|
{
|
||||||
|
temp = "</flames>\n";
|
||||||
|
f.write(temp.c_str(), temp.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
f.close();
|
||||||
|
b = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cout << "Error: Writing flame " << filename << " failed." << endl;
|
||||||
|
b = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
if (f.is_open())
|
||||||
|
f.close();
|
||||||
|
|
||||||
|
b = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the Xml string representation of an ember.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ember">The ember to create the Xml with</param>
|
||||||
|
/// <param name="extraAttributes">If true, add extra attributes, else don't</param>
|
||||||
|
/// <param name="printEditDepth">How deep the edit depth goes</param>
|
||||||
|
/// <param name="doEdits">If true included edit tags, else don't.</param>
|
||||||
|
/// <param name="intPalette">If true use integers instead of floating point numbers when embedding a non-hex formatted palette, else use floating point numbers.</param>
|
||||||
|
/// <param name="hexPalette">If true, embed a hexadecimal palette instead of Xml Color tags, else use Xml color tags.</param>
|
||||||
|
/// <returns>The Xml string representation of the passed in ember</returns>
|
||||||
|
string ToString(Ember<T>& ember, string extraAttributes, unsigned int printEditDepth, bool doEdits, bool intPalette, bool hexPalette = true)
|
||||||
|
{
|
||||||
|
unsigned int i, j;
|
||||||
|
ostringstream os;
|
||||||
|
|
||||||
|
os << "<flame version=\"EMBER-" << EmberVersion() << "\" time=\"" << ember.m_Time << "\"";
|
||||||
|
|
||||||
|
if (!ember.m_Name.empty())
|
||||||
|
os << " name=\"" << ember.m_Name << "\"";
|
||||||
|
|
||||||
|
os << " size=\"" << ember.m_FinalRasW << " " << ember.m_FinalRasH << "\"";
|
||||||
|
os << " center=\"" << ember.m_CenterX << " " << ember.m_CenterY << "\"";
|
||||||
|
os << " scale=\"" << ember.m_PixelsPerUnit << "\"";
|
||||||
|
|
||||||
|
if (ember.m_Zoom != 0)
|
||||||
|
os << " zoom=\"" << ember.m_Zoom << "\"";
|
||||||
|
|
||||||
|
os << " rotate=\"" << ember.m_Rotate << "\"";
|
||||||
|
os << " supersample=\"" << max(1u, ember.m_Supersample) << "\"";
|
||||||
|
os << " filter=\"" << ember.m_SpatialFilterRadius << "\"";
|
||||||
|
|
||||||
|
os << " filter_shape=\"" << ToLower(SpatialFilterCreator<T>::ToString(ember.m_SpatialFilterType)) << "\"";
|
||||||
|
os << " temporal_filter_type=\"" << ToLower(TemporalFilterCreator<T>::ToString(ember.m_TemporalFilterType)) << "\"";
|
||||||
|
|
||||||
|
if (ember.m_TemporalFilterType == EXP_TEMPORAL_FILTER)
|
||||||
|
os << " temporal_filter_exp=\"" << ember.m_TemporalFilterExp << "\"";
|
||||||
|
|
||||||
|
os << " temporal_filter_width=\"" << ember.m_TemporalFilterWidth << "\"";
|
||||||
|
os << " quality=\"" << ember.m_Quality << "\"";
|
||||||
|
os << " passes=\"" << ember.m_Passes << "\"";
|
||||||
|
os << " temporal_samples=\"" << ember.m_TemporalSamples << "\"";
|
||||||
|
os << " background=\"" << ember.m_Background.r << " " << ember.m_Background.g << " " << ember.m_Background.b << "\"";
|
||||||
|
os << " brightness=\"" << ember.m_Brightness << "\"";
|
||||||
|
os << " gamma=\"" << ember.m_Gamma << "\"";
|
||||||
|
os << " highlight_power=\"" << ember.m_HighlightPower << "\"";
|
||||||
|
os << " vibrancy=\"" << ember.m_Vibrancy << "\"";
|
||||||
|
//os << " hue=\"" << ember.m_Hue << "\"";//Oddly enough, flam3 never wrote this value out.//ORIG
|
||||||
|
os << " estimator_radius=\"" << ember.m_MaxRadDE << "\"";
|
||||||
|
os << " estimator_minimum=\"" << ember.m_MinRadDE << "\"";
|
||||||
|
os << " estimator_curve=\"" << ember.m_CurveDE << "\"";
|
||||||
|
os << " gamma_threshold=\"" << ember.m_GammaThresh << "\"";
|
||||||
|
os << " cam_zpos=\"" << ember.m_CamZPos << "\"";
|
||||||
|
os << " cam_persp=\"" << ember.m_CamPerspective << "\"";
|
||||||
|
os << " cam_yaw=\"" << ember.m_CamYaw << "\"";
|
||||||
|
os << " cam_pitch=\"" << ember.m_CamPitch << "\"";
|
||||||
|
os << " cam_dof=\"" << ember.m_CamDepthBlur << "\"";
|
||||||
|
|
||||||
|
if (ember.m_PaletteMode == PALETTE_STEP)
|
||||||
|
os << " palette_mode=\"step\"";
|
||||||
|
else if (ember.m_PaletteMode == PALETTE_LINEAR)
|
||||||
|
os << " palette_mode=\"linear\"";
|
||||||
|
|
||||||
|
if (ember.m_Interp == EMBER_INTERP_SMOOTH)
|
||||||
|
os << " interpolation=\"smooth\"";
|
||||||
|
|
||||||
|
if (ember.m_AffineInterp == INTERP_LINEAR)
|
||||||
|
os << " interpolation_type=\"linear\"";
|
||||||
|
else if (ember.m_AffineInterp == INTERP_LOG)
|
||||||
|
os << " interpolation_type=\"log\"";
|
||||||
|
else if (ember.m_AffineInterp == INTERP_COMPAT)
|
||||||
|
os << " interpolation_type=\"old\"";
|
||||||
|
else if (ember.m_AffineInterp == INTERP_OLDER)
|
||||||
|
os << " interpolation_type=\"older\"";
|
||||||
|
|
||||||
|
if (ember.m_PaletteInterp == INTERP_SWEEP)
|
||||||
|
os << " palette_interpolation=\"sweep\"";
|
||||||
|
|
||||||
|
if (!extraAttributes.empty())
|
||||||
|
os << " " << extraAttributes;
|
||||||
|
|
||||||
|
os << ">\n";
|
||||||
|
|
||||||
|
//This is a grey area, what to do about symmetry to avoid duplicating the symmetry xforms when reading back?//TODO//BUG.
|
||||||
|
//if (ember.m_Symmetry)
|
||||||
|
// os << " <symmetry kind=\"" << ember.m_Symmetry << "\"/>\n";
|
||||||
|
|
||||||
|
for (i = 0; i < ember.XformCount(); i++)
|
||||||
|
os << ToString(*ember.GetXform(i), ember.XformCount(), false, false);//Not final, don't do motion.
|
||||||
|
|
||||||
|
if (ember.UseFinalXform())
|
||||||
|
os << ToString(*ember.NonConstFinalXform(), ember.XformCount(), true, false);//Final, don't do motion.
|
||||||
|
|
||||||
|
if (hexPalette)
|
||||||
|
{
|
||||||
|
os << " <palette count=\"256\" format=\"RGB\">\n";
|
||||||
|
|
||||||
|
for (i = 0; i < 32; i++)
|
||||||
|
{
|
||||||
|
os << " ";
|
||||||
|
|
||||||
|
for (j = 0; j < 8; j++)
|
||||||
|
{
|
||||||
|
int idx = 8 * i + j;
|
||||||
|
|
||||||
|
os << hex << setw(2) << setfill('0') << (int)Rint(ember.m_Palette[idx][0] * 255);
|
||||||
|
os << hex << setw(2) << setfill('0') << (int)Rint(ember.m_Palette[idx][1] * 255);
|
||||||
|
os << hex << setw(2) << setfill('0') << (int)Rint(ember.m_Palette[idx][2] * 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
os << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
os << " </palette>\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
double r = ember.m_Palette[i][0] * 255;
|
||||||
|
double g = ember.m_Palette[i][1] * 255;
|
||||||
|
double b = ember.m_Palette[i][2] * 255;
|
||||||
|
double a = ember.m_Palette[i][3] * 255;
|
||||||
|
|
||||||
|
os << " ";
|
||||||
|
//The original used a precision of 6 which is totally unnecessary, use 2.
|
||||||
|
if (IsClose(a, 255.0))
|
||||||
|
{
|
||||||
|
if (intPalette)
|
||||||
|
os << "<color index=\"" << i << "\" rgb=\"" << (int)Rint(r) << " " << (int)Rint(g) << " " << (int)Rint(b) << "\"/>";
|
||||||
|
else
|
||||||
|
os << "<color index=\"" << i << "\" rgb=\"" << std::fixed << std::setprecision(2) << r << " " << g << " " << b << "\"/>";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (intPalette)
|
||||||
|
os << " <color index=\"" << i << "\" rgba=\"" << (int)Rint(r) << " " << (int)Rint(g) << " " << (int)Rint(b) << " " << (int)Rint(a) << "\"/>";
|
||||||
|
else
|
||||||
|
os << " <color index=\"" << i << "\" rgba=\"" << std::fixed << std::setprecision(2) << r << " " << g << " " << b << " " << a << "\"/>";
|
||||||
|
}
|
||||||
|
|
||||||
|
os << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (doEdits && ember.m_Edits != NULL)
|
||||||
|
os << ToString(xmlDocGetRootElement(ember.m_Edits), 1, true, printEditDepth);
|
||||||
|
|
||||||
|
os << "</flame>\n";
|
||||||
|
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create a new editdoc optionally based on parents passed in.
|
||||||
|
/// This is used when an ember is made out of some mutation or edit from one or two existing embers and
|
||||||
|
/// the user wants to capture the genetic lineage history information in the edit doc of the new ember.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="parent0">The first parent, optionally NULL.</param>
|
||||||
|
/// <param name="parent1">The second parent, optionally NULL.</param>
|
||||||
|
/// <param name="action">The action that was taken to create the new ember</param>
|
||||||
|
/// <param name="nick">The nickname of the author</param>
|
||||||
|
/// <param name="url">The Url of the author</param>
|
||||||
|
/// <param name="id">The id of the author</param>
|
||||||
|
/// <param name="comment">The comment to include</param>
|
||||||
|
/// <param name="sheepGen">The sheep generation used if > 0. Default: 0.</param>
|
||||||
|
/// <param name="sheepId">The sheep id used if > 0. Default: 0.</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
xmlDocPtr CreateNewEditdoc(Ember<T>* parent0, Ember<T>* parent1, string action, string nick, string url, string id, string comment, int sheepGen = 0, int sheepId = 0)
|
||||||
|
{
|
||||||
|
char timeString[128];
|
||||||
|
char buffer[128];
|
||||||
|
char commentString[128];
|
||||||
|
tm localt;
|
||||||
|
time_t myTime;
|
||||||
|
xmlDocPtr commentDoc = NULL;
|
||||||
|
xmlDocPtr doc = xmlNewDoc(XC "1.0");
|
||||||
|
xmlNodePtr rootNode = NULL, node = NULL, nodeCopy = NULL;
|
||||||
|
xmlNodePtr rootComment = NULL;
|
||||||
|
|
||||||
|
//Create the root node, called "edit".
|
||||||
|
rootNode = xmlNewNode(NULL, XC "edit");
|
||||||
|
xmlDocSetRootElement(doc, rootNode);
|
||||||
|
|
||||||
|
//Add the edit attributes.
|
||||||
|
//Date.
|
||||||
|
myTime = time(NULL);
|
||||||
|
localtime_s(&localt, &myTime);
|
||||||
|
strftime(timeString, 128, "%a %b %d %H:%M:%S %z %Y", &localt);//XXX use standard time format including timezone.
|
||||||
|
xmlNewProp(rootNode, XC "date", XC timeString);
|
||||||
|
|
||||||
|
//Nick.
|
||||||
|
if (nick != "")
|
||||||
|
xmlNewProp(rootNode, XC "nick", XC nick.c_str());
|
||||||
|
|
||||||
|
//Url.
|
||||||
|
if (url != "")
|
||||||
|
xmlNewProp(rootNode, XC "url", XC url.c_str());
|
||||||
|
|
||||||
|
if (id != "")
|
||||||
|
xmlNewProp(rootNode, XC "id", XC id.c_str());
|
||||||
|
|
||||||
|
//Action.
|
||||||
|
xmlNewProp(rootNode, XC "action", XC action.c_str());
|
||||||
|
|
||||||
|
//Sheep info.
|
||||||
|
if (sheepGen > 0 && sheepId > 0)
|
||||||
|
{
|
||||||
|
//Create a child node of the root node called sheep.
|
||||||
|
node = xmlNewChild(rootNode, NULL, XC "sheep", NULL);
|
||||||
|
|
||||||
|
//Create the sheep attributes.
|
||||||
|
sprintf_s(buffer, 128, "%d", sheepGen);
|
||||||
|
xmlNewProp(node, XC "generation", XC buffer);
|
||||||
|
|
||||||
|
sprintf_s(buffer, 128, "%d", sheepId);
|
||||||
|
xmlNewProp(node, XC "id", XC buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Check for the parents.
|
||||||
|
//If parent 0 not specified, this is a randomly generated genome.
|
||||||
|
if (parent0)
|
||||||
|
{
|
||||||
|
if (parent0->m_Edits)
|
||||||
|
{
|
||||||
|
//Copy the node from the parent.
|
||||||
|
node = xmlDocGetRootElement(parent0->m_Edits);
|
||||||
|
nodeCopy = xmlCopyNode(node, 1);
|
||||||
|
AddFilenameWithoutAmpersand(nodeCopy, parent0->m_ParentFilename);
|
||||||
|
sprintf_s(buffer, 128, "%d", parent0->m_Index);
|
||||||
|
xmlNewProp(nodeCopy, XC "index", XC buffer);
|
||||||
|
xmlAddChild(rootNode, nodeCopy);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Insert a (parent has no edit) message.
|
||||||
|
nodeCopy = xmlNewChild(rootNode, NULL, XC "edit", NULL);
|
||||||
|
AddFilenameWithoutAmpersand(nodeCopy, parent0->m_ParentFilename);
|
||||||
|
sprintf_s(buffer, 128, "%d", parent0->m_Index);
|
||||||
|
xmlNewProp(nodeCopy, XC "index", XC buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parent1)
|
||||||
|
{
|
||||||
|
if (parent1->m_Edits)
|
||||||
|
{
|
||||||
|
//Copy the node from the parent.
|
||||||
|
node = xmlDocGetRootElement(parent1->m_Edits);
|
||||||
|
nodeCopy = xmlCopyNode(node, 1);
|
||||||
|
AddFilenameWithoutAmpersand(nodeCopy, parent1->m_ParentFilename);
|
||||||
|
sprintf_s(buffer, 128, "%d", parent1->m_Index);
|
||||||
|
xmlNewProp(nodeCopy, XC "index", XC buffer);
|
||||||
|
xmlAddChild(rootNode, nodeCopy);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Insert a (parent has no edit) message.
|
||||||
|
nodeCopy = xmlNewChild(rootNode, NULL, XC "edit",NULL);
|
||||||
|
AddFilenameWithoutAmpersand(nodeCopy, parent1->m_ParentFilename);
|
||||||
|
sprintf_s(buffer, 128, "%d", parent1->m_Index);
|
||||||
|
xmlNewProp(nodeCopy, XC "index", XC buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Comment string:
|
||||||
|
//This one's hard, since the comment string must be treated as
|
||||||
|
//a valid XML document. Create a new document using the comment
|
||||||
|
//string as the in-memory document, and then copy all children of
|
||||||
|
//the root node into the edit structure
|
||||||
|
//Parsing the comment string should be done once and then copied
|
||||||
|
//for each new edit doc, but that's for later.
|
||||||
|
if (comment != "")
|
||||||
|
{
|
||||||
|
sprintf_s(commentString, 128, "<comm>%s</comm>", comment.c_str());
|
||||||
|
commentDoc = xmlReadMemory(commentString, (int)strlen(commentString), "comment.env", NULL, XML_PARSE_NONET);
|
||||||
|
|
||||||
|
//Check for errors.
|
||||||
|
if (commentDoc != NULL)
|
||||||
|
{
|
||||||
|
|
||||||
|
//Loop through the children of the new document and copy them into the rootNode.
|
||||||
|
rootComment = xmlDocGetRootElement(commentDoc);
|
||||||
|
|
||||||
|
for (node = rootComment->children; node; node = node->next)
|
||||||
|
{
|
||||||
|
nodeCopy = xmlCopyNode(node, 1);
|
||||||
|
xmlAddChild(rootNode, nodeCopy);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Free the created document.
|
||||||
|
xmlFreeDoc(commentDoc);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cout << "Failed to parse comment into Xml." << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Return the xml doc.
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// <summary>
|
||||||
|
/// Return the Xml string representation of an xform.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="xform">The xform to create the Xml with</param>
|
||||||
|
/// <param name="xformCount">The number of non-final xforms in the ember to which this xform belongs. Used for xaos.</param>
|
||||||
|
/// <param name="isFinal">True if the xform is the final xform in the ember, else false.</param>
|
||||||
|
/// <param name="doMotion">If true, include motion elements in the Xml string, else omit.</param>
|
||||||
|
/// <returns>The Xml string representation of the passed in xform</returns>
|
||||||
|
string ToString(Xform<T>& xform, unsigned int xformCount, bool isFinal, bool doMotion)
|
||||||
|
{
|
||||||
|
unsigned int i, j;
|
||||||
|
ostringstream os;
|
||||||
|
|
||||||
|
if (doMotion)
|
||||||
|
{
|
||||||
|
os << " <motion motion_frequency=\"" << xform.m_MotionFreq << "\" ";
|
||||||
|
|
||||||
|
if (xform.m_MotionFunc == MOTION_SIN)
|
||||||
|
os << "motion_function=\"sin\" ";
|
||||||
|
else if (xform.m_MotionFunc == MOTION_TRIANGLE)
|
||||||
|
os << "motion_function=\"triangle\" ";
|
||||||
|
else if (xform.m_MotionFunc== MOTION_HILL)
|
||||||
|
os << "motion_function=\"hill\" ";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (isFinal)
|
||||||
|
os << " <finalxform ";
|
||||||
|
else
|
||||||
|
os << " <xform weight=\"" << xform.m_Weight << "\" ";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!doMotion)
|
||||||
|
{
|
||||||
|
os << "color=\"" << xform.m_ColorX << "\" ";
|
||||||
|
//os << "color=\"" << xform.m_ColorX << " " << xform.m_ColorY << "\" ";
|
||||||
|
os << "var_color=\"" << xform.m_DirectColor << "\" ";
|
||||||
|
os << "color_speed=\"" << xform.m_ColorSpeed << "\" ";
|
||||||
|
os << "symmetry=\"" << xform.m_ColorSpeed << "\" ";//Legacy support.
|
||||||
|
|
||||||
|
string s = xform.m_Name;
|
||||||
|
|
||||||
|
std::replace(s.begin(), s.end(), ' ', '_');
|
||||||
|
os << "name=\"" << s << "\" ";//Flam3 didn't do this, but Apo does.
|
||||||
|
|
||||||
|
if (!isFinal)
|
||||||
|
os << "animate=\"" << xform.m_Animate << "\" ";
|
||||||
|
}
|
||||||
|
|
||||||
|
//Variation writing order differs slightly from the original to make it a bit more readable.
|
||||||
|
//The original wrote out all of the variation names and weights. Then wrote out the parameters for
|
||||||
|
//the parametric variations. Here, write out the params immediately after each parametric variation
|
||||||
|
//so they are more closely grouped with the variation they apply to, rather than being all grouped at the end.
|
||||||
|
for (i = 0; i < xform.TotalVariationCount(); i++)
|
||||||
|
{
|
||||||
|
Variation<T>* var = xform.GetVariation(i);
|
||||||
|
ParametricVariation<T>* parVar = dynamic_cast<ParametricVariation<T>*>(var);
|
||||||
|
|
||||||
|
if (var->m_Weight != 0)
|
||||||
|
{
|
||||||
|
os << var->Name() << "=\"" << var->m_Weight << "\" ";
|
||||||
|
|
||||||
|
if (parVar)
|
||||||
|
{
|
||||||
|
ParamWithName<T>* params = parVar->Params();
|
||||||
|
|
||||||
|
for (j = 0; j < parVar->ParamCount(); j++)
|
||||||
|
{
|
||||||
|
if ((!doMotion || (doMotion && (params[j].ParamVal() != 0))) && !params[j].IsPrecalc())
|
||||||
|
os << params[j].Name() << "=\"" << params[j].ParamVal() << "\" ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!doMotion || (doMotion && !xform.m_Affine.IsZero()))
|
||||||
|
{
|
||||||
|
os << "coefs=\"" << xform.m_Affine.A() << " " << xform.m_Affine.D() << " " << xform.m_Affine.B() << " "
|
||||||
|
<< xform.m_Affine.E() << " " << xform.m_Affine.C() << " " << xform.m_Affine.F() << "\"";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((!doMotion && !xform.m_Post.IsID()) || (doMotion && !xform.m_Post.IsZero()))
|
||||||
|
{
|
||||||
|
os << " post=\"" << xform.m_Post.A() << " " << xform.m_Post.D() << " " << xform.m_Post.B() << " "
|
||||||
|
<< xform.m_Post.E() << " " << xform.m_Post.C() << " " << xform.m_Post.F() << "\"";
|
||||||
|
}
|
||||||
|
|
||||||
|
//Original only printed xaos values that were not 1. Here, print them all out if any are present.
|
||||||
|
if (!isFinal && !doMotion && xform.XaosPresent())
|
||||||
|
{
|
||||||
|
os << " chaos=\"";
|
||||||
|
|
||||||
|
for (i = 0; i < xformCount; i++)
|
||||||
|
os << xform.Xaos(i) << " ";
|
||||||
|
|
||||||
|
os << "\"";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!doMotion)
|
||||||
|
os << " opacity=\"" << xform.m_Opacity << "\"";
|
||||||
|
|
||||||
|
if (!doMotion && !xform.m_Motion.empty())
|
||||||
|
{
|
||||||
|
os << ">\n";
|
||||||
|
|
||||||
|
for (i = 0; i < xform.m_Motion.size(); i++)
|
||||||
|
os << ToString(xform.m_Motion[i], 0, false, true);
|
||||||
|
|
||||||
|
if (isFinal)//Fixed to properly close final.//SMOULDER
|
||||||
|
os << " </finalxform>\n";
|
||||||
|
else
|
||||||
|
os << " </xform>\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
os << "/>\n";
|
||||||
|
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return an edit node Xml string.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="editNode">The edit node to get the string for</param>
|
||||||
|
/// <param name="tabs">How many tabs to use</param>
|
||||||
|
/// <param name="formatting">If true, include newlines and tabs, else don't.</param>
|
||||||
|
/// <param name="printEditDepth">How deep the edit depth goes</param>
|
||||||
|
/// <returns>The edit node Xml string</returns>
|
||||||
|
string ToString(xmlNodePtr editNode, unsigned int tabs, bool formatting, unsigned int printEditDepth)
|
||||||
|
{
|
||||||
|
bool indentPrinted = false;
|
||||||
|
char* tabString = " ", *attStr;
|
||||||
|
unsigned int ti, editOrSheep = 0;
|
||||||
|
xmlAttrPtr attPtr = NULL, curAtt = NULL;
|
||||||
|
xmlNodePtr childPtr = NULL, curChild = NULL;
|
||||||
|
ostringstream os;
|
||||||
|
|
||||||
|
if (printEditDepth > 0 && tabs > printEditDepth)
|
||||||
|
return "";
|
||||||
|
|
||||||
|
//If this node is an XML_ELEMENT_NODE, print it and its attributes.
|
||||||
|
if (editNode->type == XML_ELEMENT_NODE)
|
||||||
|
{
|
||||||
|
//Print the node at the tab specified.
|
||||||
|
if (formatting)
|
||||||
|
for (ti = 0; ti < tabs; ti++)
|
||||||
|
os << tabString;
|
||||||
|
|
||||||
|
os << "<" << editNode->name;
|
||||||
|
|
||||||
|
//This can either be an edit node or a sheep node.
|
||||||
|
//If it's an edit node, add one to the tab.
|
||||||
|
if (!Compare(editNode->name, "edit"))
|
||||||
|
{
|
||||||
|
editOrSheep = 1;
|
||||||
|
tabs++;
|
||||||
|
}
|
||||||
|
else if (!Compare(editNode->name, "sheep"))
|
||||||
|
editOrSheep = 2;
|
||||||
|
else
|
||||||
|
editOrSheep = 0;
|
||||||
|
|
||||||
|
//Print the attributes.
|
||||||
|
attPtr = editNode->properties;
|
||||||
|
|
||||||
|
for (curAtt = attPtr; curAtt; curAtt = curAtt->next)
|
||||||
|
{
|
||||||
|
attStr = (char*)xmlGetProp(editNode, curAtt->name);
|
||||||
|
os << " " << curAtt->name << "=\"" << attStr << "\"";
|
||||||
|
xmlFree(attStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Does this node have children?
|
||||||
|
if (!editNode->children || (printEditDepth > 0 && tabs > printEditDepth))
|
||||||
|
{
|
||||||
|
//Close the tag and subtract the tab.
|
||||||
|
os << "/>";
|
||||||
|
|
||||||
|
if (formatting)
|
||||||
|
os << "\n";
|
||||||
|
|
||||||
|
tabs--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Close the tag.
|
||||||
|
os << ">";
|
||||||
|
|
||||||
|
if (formatting)
|
||||||
|
os << "\n";
|
||||||
|
|
||||||
|
//Loop through the children and print them.
|
||||||
|
childPtr = editNode->children;
|
||||||
|
indentPrinted = false;
|
||||||
|
|
||||||
|
for (curChild = childPtr; curChild; curChild = curChild->next)
|
||||||
|
{
|
||||||
|
//If child is an element, indent first and then print it.
|
||||||
|
if (curChild->type == XML_ELEMENT_NODE &&
|
||||||
|
(!Compare(curChild->name, "edit") || !Compare(curChild->name, "sheep")))
|
||||||
|
{
|
||||||
|
if (indentPrinted)
|
||||||
|
{
|
||||||
|
indentPrinted = false;
|
||||||
|
os << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
os << ToString(curChild, tabs, true, printEditDepth);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Child is a text node, don't want to indent more than once.
|
||||||
|
if (xmlIsBlankNode(curChild))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!indentPrinted && formatting)
|
||||||
|
{
|
||||||
|
for (ti = 0; ti < tabs; ti++)
|
||||||
|
os << tabString;
|
||||||
|
|
||||||
|
indentPrinted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Print nodes without formatting.
|
||||||
|
os << ToString(curChild, tabs, false, printEditDepth);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (indentPrinted && formatting)
|
||||||
|
os << "\n";
|
||||||
|
|
||||||
|
tabs--;//Tab out.
|
||||||
|
|
||||||
|
if (formatting)
|
||||||
|
for (ti = 0; ti < tabs; ti++)
|
||||||
|
os << tabString;
|
||||||
|
|
||||||
|
os << "</" << editNode->name << ">";//Close the tag.
|
||||||
|
|
||||||
|
if (formatting)
|
||||||
|
os << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (editNode->type == XML_TEXT_NODE)
|
||||||
|
{
|
||||||
|
string s((char*)xmlNodeGetContent(editNode));
|
||||||
|
os << Trim(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddFilenameWithoutAmpersand(xmlNodePtr node, string& filename)
|
||||||
|
{
|
||||||
|
if (filename.find_first_of('&') != std::string::npos)
|
||||||
|
{
|
||||||
|
string filenameWithoutAmpersands = filename;
|
||||||
|
|
||||||
|
FindAndReplace<string>(filenameWithoutAmpersands, "&", "&");
|
||||||
|
xmlNewProp(node, XC "filename", XC filenameWithoutAmpersands.c_str());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xmlNewProp(node, XC "filename", XC filename.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
1018
Source/Ember/Interpolate.h
Normal file
1018
Source/Ember/Interpolate.h
Normal file
File diff suppressed because it is too large
Load Diff
386
Source/Ember/Isaac.h
Normal file
386
Source/Ember/Isaac.h
Normal file
@ -0,0 +1,386 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "EmberDefines.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// C++ TEMPLATE VERSION OF Robert J. Jenkins Jr.'s
|
||||||
|
/// ISAAC Random Number Generator.
|
||||||
|
///
|
||||||
|
/// Ported from vanilla C to to template C++ class
|
||||||
|
/// by Quinn Tyler Jackson on 16-23 July 1998.
|
||||||
|
///
|
||||||
|
/// quinn@qtj.net
|
||||||
|
///
|
||||||
|
/// The function for the expected period of this
|
||||||
|
/// random number generator, according to Jenkins is:
|
||||||
|
///
|
||||||
|
/// f(a,b) = 2**((a+b*(3+2^^a)-1)
|
||||||
|
///
|
||||||
|
/// (where a is ALPHA and b is bitwidth)
|
||||||
|
///
|
||||||
|
/// So, for a bitwidth of 32 and an ALPHA of 8,
|
||||||
|
/// the expected period of ISAAC is:
|
||||||
|
///
|
||||||
|
/// 2^^(8+32*(3+2^^8)-1) = 2^^8295
|
||||||
|
///
|
||||||
|
/// Jackson has been able to run implementations
|
||||||
|
/// with an ALPHA as high as 16, or
|
||||||
|
///
|
||||||
|
/// 2^^2097263
|
||||||
|
///
|
||||||
|
/// -Modified by Matt Feemster to eliminate needless dynamic memory allocation and virtual functions and bring inline with Ember coding style.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
#ifndef __ISAAC64
|
||||||
|
typedef unsigned long int ISAAC_INT;
|
||||||
|
const ISAAC_INT GOLDEN_RATIO = ISAAC_INT(0x9e3779b9);
|
||||||
|
#else
|
||||||
|
typedef unsigned __int64 ISAAC_INT;
|
||||||
|
const ISAAC_INT GOLDEN_RATIO = ISAAC_INT(0x9e3779b97f4a7c13);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace EmberNs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// QTIsaac class which allows using ISAAC in an OOP manner.
|
||||||
|
/// </summary>
|
||||||
|
template <int ALPHA = 4, class T = ISAAC_INT>
|
||||||
|
class EMBER_API QTIsaac
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef unsigned char byte;
|
||||||
|
enum { N = (1 << ALPHA) };
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Global ISAAC RNG to be used from anywhere. This is not thread safe, so take caution to only
|
||||||
|
/// use it when no other threads are.
|
||||||
|
/// </summary>
|
||||||
|
static auto_ptr<QTIsaac<ALPHA, ISAAC_INT>> GlobalRand;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The structure which holds all of the random information.
|
||||||
|
/// </summary>
|
||||||
|
struct EMBER_API randctx
|
||||||
|
{
|
||||||
|
T randcnt;
|
||||||
|
T randrsl[N];
|
||||||
|
T randmem[N];
|
||||||
|
T randa;
|
||||||
|
T randb;
|
||||||
|
T randc;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which initialized the random context using the values passed in.
|
||||||
|
/// Leaving these as their defaults is fine, and will still give different
|
||||||
|
/// results because time is internally used if they are default.
|
||||||
|
/// However, specifying specific values is useful if you want to duplicate
|
||||||
|
/// a sequence of random numbers.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="a">First random seed. Default: 0.</param>
|
||||||
|
/// <param name="b">Second random seed. Default: 0.</param>
|
||||||
|
/// <param name="c">Third random seed. Default: 0.</param>
|
||||||
|
/// <param name="s">Pointer to a buffer of 256 random integer seeds. Default: NULL.</param>
|
||||||
|
QTIsaac(T a = 0, T b = 0, T c = 0, T* s = NULL)
|
||||||
|
{
|
||||||
|
Srand(a, b, c, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the next random integer.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The next random integer</returns>
|
||||||
|
inline T Rand()
|
||||||
|
{
|
||||||
|
return (m_Rc.randcnt++ == N ? (Isaac(&m_Rc), m_Rc.randcnt=0, m_Rc.randrsl[m_Rc.randcnt]) : m_Rc.randrsl[m_Rc.randcnt]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the next random integer between 0 and the value passed in.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>A value one greater than the maximum value that will be returned</returns>
|
||||||
|
inline T Rand(T upper)
|
||||||
|
{
|
||||||
|
return (upper == 0) ? Rand() : Rand() % upper;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a random floating point value between the specified minimum and maximum.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="fMin">The minimum value allowed, inclusive.</param>
|
||||||
|
/// <param name="fMax">The maximum value allowed, inclusive.</param>
|
||||||
|
/// <returns>A new random floating point value within the specified range, inclusive.</returns>
|
||||||
|
template<typename floatType>
|
||||||
|
inline floatType Frand(floatType fMin, floatType fMax)
|
||||||
|
{
|
||||||
|
floatType f = (floatType)Rand() / (floatType)std::numeric_limits<T>::max();
|
||||||
|
return fMin + (f * (fMax - fMin));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Thin wrapper around a call to Frand() with a range of 0-1.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>A new random number in the range of 0-1, inclusive.</returns>
|
||||||
|
template<typename floatType>
|
||||||
|
inline floatType Frand01()
|
||||||
|
{
|
||||||
|
return Frand<floatType>(floatType(0), floatType(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Thin wrapper around a call to Frand() with a range of -1-1.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>A new random number in the range of -1-1, inclusive.</returns>
|
||||||
|
template<typename floatType>
|
||||||
|
inline floatType Frand11()
|
||||||
|
{
|
||||||
|
return Frand<floatType>(floatType(-1), floatType(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Not sure what this does.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Something that is golden</returns>
|
||||||
|
template<typename floatType>
|
||||||
|
inline floatType GoldenBit()
|
||||||
|
{
|
||||||
|
return RandBit() ? floatType(0.38196) : floatType(0.61804);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a random 0 or 1.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>A random 0 or 1</returns>
|
||||||
|
inline unsigned int RandBit()
|
||||||
|
{
|
||||||
|
return Rand() & 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A different way of getting a floating point rand in the range -1-1.
|
||||||
|
/// Flam3 used this but it seems unnecessary now, keep around if it's ever needed.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>A new random number in the range of -1-1, inclusive.</returns>
|
||||||
|
//double drand11()
|
||||||
|
//{
|
||||||
|
// return (((int)Rand() & 0xfffffff) - 0x7ffffff) / (double) 0x7ffffff;
|
||||||
|
//}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a random context.
|
||||||
|
/// Unsure exacly how this works, but it does.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ctx">The random context to initialize</param>
|
||||||
|
/// <param name="useSeed">Whether to use the seeds passed in to the constructor, else zero.</param>
|
||||||
|
void RandInit(randctx* ctx, bool useSeed)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
T a, b, c, d, e, f, g, h;
|
||||||
|
T* m = ctx->randmem;
|
||||||
|
T* r = ctx->randrsl;
|
||||||
|
|
||||||
|
a = b = c = d = e = f = g = h = GOLDEN_RATIO;
|
||||||
|
|
||||||
|
if (!useSeed)
|
||||||
|
{
|
||||||
|
ctx->randa = 0;
|
||||||
|
ctx->randb = 0;
|
||||||
|
ctx->randc = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Scramble it.
|
||||||
|
for (i = 0; i < 4; ++i)
|
||||||
|
{
|
||||||
|
Shuffle(a, b, c, d, e, f, g, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (useSeed)
|
||||||
|
{
|
||||||
|
//Initialize using the contents of r[] as the seed.
|
||||||
|
for (i = 0; i < N; i += 8)
|
||||||
|
{
|
||||||
|
a += r[i ]; b += r[i + 1]; c += r[i + 2]; d += r[i + 3];
|
||||||
|
e += r[i + 4]; f += r[i + 5]; g += r[i + 6]; h += r[i + 7];
|
||||||
|
|
||||||
|
Shuffle(a, b, c, d, e, f, g, h);
|
||||||
|
|
||||||
|
m[i ] = a; m[i + 1] = b; m[i + 2] = c; m[i + 3] = d;
|
||||||
|
m[i + 4] = e; m[i + 5] = f; m[i + 6] = g; m[i + 7] = h;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Do a second pass to make all of the seed affect all of m.
|
||||||
|
for (i = 0; i < N; i += 8)
|
||||||
|
{
|
||||||
|
a += m[i ]; b += m[i + 1]; c += m[i + 2]; d += m[i + 3];
|
||||||
|
e += m[i + 4]; f += m[i + 5]; g += m[i + 6]; h += m[i + 7];
|
||||||
|
|
||||||
|
Shuffle(a, b, c, d, e, f, g, h);
|
||||||
|
|
||||||
|
m[i ] = a; m[i + 1] = b; m[i + 2] = c; m[i + 3] = d;
|
||||||
|
m[i + 4] = e; m[i + 5] = f; m[i + 6] = g; m[i + 7] = h;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Fill in mm[] with messy stuff.
|
||||||
|
Shuffle(a, b, c, d, e, f, g, h);
|
||||||
|
|
||||||
|
m[i ] = a; m[i + 1] = b; m[i + 2] = c; m[i + 3] = d;
|
||||||
|
m[i + 4] = e; m[i + 5] = f; m[i + 6] = g; m[i + 7] = h;
|
||||||
|
}
|
||||||
|
|
||||||
|
Isaac(ctx); //Fill in the first set of results.
|
||||||
|
ctx->randcnt = 0;//Prepare to use the first set of results.
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initialize the seeds of the member random context using the specified seeds.
|
||||||
|
/// If s is null, time plus index up to 256 is used for the random buffer.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="a">First random seed. Default: 0.</param>
|
||||||
|
/// <param name="b">Second random seed. Default: 0.</param>
|
||||||
|
/// <param name="c">Third random seed. Default: 0.</param>
|
||||||
|
/// <param name="s">Pointer to a buffer of 256 random integer seeds. Default: NULL.</param>
|
||||||
|
void Srand(T a = 0, T b = 0, T c = 0, T* s = NULL)
|
||||||
|
{
|
||||||
|
if (s == NULL)//Default to using time plus index as the seed if s was NULL.
|
||||||
|
{
|
||||||
|
for (int i = 0; i < N; i++)
|
||||||
|
m_Rc.randrsl[i] = (T)time(0) + i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < N; i++)
|
||||||
|
m_Rc.randrsl[i] = s[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a == 0 && b == 0 && c == 0)
|
||||||
|
{
|
||||||
|
m_Rc.randa = (T)time(0);
|
||||||
|
m_Rc.randb = (T)time(0) * (T)time(0);
|
||||||
|
m_Rc.randc = (T)time(0) * (T)time(0) * (T)time(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_Rc.randa = a;
|
||||||
|
m_Rc.randb = b;
|
||||||
|
m_Rc.randc = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
RandInit(&m_Rc, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// <summary>
|
||||||
|
/// Compute the next batch of random numbers for a random context.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ctx">The context to populate.</param>
|
||||||
|
void Isaac(randctx* ctx)
|
||||||
|
{
|
||||||
|
T x,y;
|
||||||
|
|
||||||
|
T* mm = ctx->randmem;
|
||||||
|
T* r = ctx->randrsl;
|
||||||
|
|
||||||
|
T a = (ctx->randa);
|
||||||
|
T b = (ctx->randb + (++ctx->randc));
|
||||||
|
|
||||||
|
T* m = mm;
|
||||||
|
T* m2 = (m + (N / 2));
|
||||||
|
T* mend = m2;
|
||||||
|
|
||||||
|
for(; m < mend; )
|
||||||
|
{
|
||||||
|
#ifndef __ISAAC64
|
||||||
|
RngStep((a << 13), a, b, mm, m, m2, r, x, y);
|
||||||
|
RngStep((a >> 6) , a, b, mm, m, m2, r, x, y);
|
||||||
|
RngStep((a << 2) , a, b, mm, m, m2, r, x, y);
|
||||||
|
RngStep((a >> 16), a, b, mm, m, m2, r, x, y);
|
||||||
|
#else // __ISAAC64
|
||||||
|
RngStep(~(a ^ (a << 21)), a, b, mm, m, m2, r, x, y);
|
||||||
|
RngStep( a ^ (a >> 5) , a, b, mm, m, m2, r, x, y);
|
||||||
|
RngStep( a ^ (a << 12) , a, b, mm, m, m2, r, x, y);
|
||||||
|
RngStep( a ^ (a >> 33) , a, b, mm, m, m2, r, x, y);
|
||||||
|
#endif // __ISAAC64
|
||||||
|
}
|
||||||
|
|
||||||
|
m2 = mm;
|
||||||
|
|
||||||
|
for(; m2<mend;)
|
||||||
|
{
|
||||||
|
#ifndef __ISAAC64
|
||||||
|
RngStep((a << 13), a, b, mm, m, m2, r, x, y);
|
||||||
|
RngStep((a >> 6) , a, b, mm, m, m2, r, x, y);
|
||||||
|
RngStep((a << 2) , a, b, mm, m, m2, r, x, y);
|
||||||
|
RngStep((a >> 16), a, b, mm, m, m2, r, x, y);
|
||||||
|
#else // __ISAAC64
|
||||||
|
RngStep(~(a ^ (a << 21)), a, b, mm, m, m2, r, x, y);
|
||||||
|
RngStep( a ^ (a >> 5) , a, b, mm, m, m2, r, x, y);
|
||||||
|
RngStep( a ^ (a << 12) , a, b, mm, m, m2, r, x, y);
|
||||||
|
RngStep( a ^ (a >> 33) , a, b, mm, m, m2, r, x, y);
|
||||||
|
#endif // __ISAAC64
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->randb = b;
|
||||||
|
ctx->randa = a;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieves a value using indirection.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="mm">The buffer.</param>
|
||||||
|
/// <param name="x">The offset.</param>
|
||||||
|
/// <returns>A new value</returns>
|
||||||
|
inline T Ind(T* mm, T x)
|
||||||
|
{
|
||||||
|
#ifndef __ISAAC64
|
||||||
|
return (*(T*)((byte*)(mm) + ((x) & ((N - 1) << 2))));
|
||||||
|
#else // __ISAAC64
|
||||||
|
return (*(T*)((byte*)(mm) + ((x) & ((N - 1) << 3))));
|
||||||
|
#endif // __ISAAC64
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unsure what this does.
|
||||||
|
/// </summary>
|
||||||
|
void RngStep(T mix, T& a, T& b, T*& mm, T*& m, T*& m2, T*& r, T& x, T& y)
|
||||||
|
{
|
||||||
|
x = *m;
|
||||||
|
a = (a ^ (mix)) + *(m2++);
|
||||||
|
*(m++) = y = Ind(mm, x) + a + b;
|
||||||
|
*(r++) = b = Ind(mm, y >> ALPHA) + x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unsure what this does.
|
||||||
|
/// </summary>
|
||||||
|
void Shuffle(T& a, T& b, T& c, T& d, T& e, T& f, T& g, T& h)
|
||||||
|
{
|
||||||
|
#ifndef __ISAAC64
|
||||||
|
a ^= b << 11; d += a; b += c;
|
||||||
|
b ^= c >> 2; e += b; c += d;
|
||||||
|
c ^= d << 8; f += c; d += e;
|
||||||
|
d ^= e >> 16; g += d; e += f;
|
||||||
|
e ^= f << 10; h += e; f += g;
|
||||||
|
f ^= g >> 4; a += f; g += h;
|
||||||
|
g ^= h << 8; b += g; h += a;
|
||||||
|
h ^= a >> 9; c += h; a += b;
|
||||||
|
#else // __ISAAC64
|
||||||
|
a -= e; f ^= h >> 9; h += a;
|
||||||
|
b -= f; g ^= a << 9; a += b;
|
||||||
|
c -= g; h ^= b >> 23; b += c;
|
||||||
|
d -= h; a ^= c << 15; c += d;
|
||||||
|
e -= a; b ^= d >> 14; d += e;
|
||||||
|
f -= b; c ^= e << 20; e += f;
|
||||||
|
g -= c; d ^= f >> 17; f += g;
|
||||||
|
h -= d; e ^= g << 14; g += h;
|
||||||
|
#endif // __ISAAC64
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
randctx m_Rc;//The random context which holds all of the seed and state information as well as the random number values.
|
||||||
|
};
|
||||||
|
}
|
541
Source/Ember/Iterator.h
Normal file
541
Source/Ember/Iterator.h
Normal file
@ -0,0 +1,541 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Ember.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Iterator and derived classes.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
//#define CHOOSE_XFORM_GRAIN 256
|
||||||
|
#define CHOOSE_XFORM_GRAIN 10000//The size of xform random selection buffer. Multiply by the (number of non-final xforms present + 1) if xaos is used.
|
||||||
|
|
||||||
|
namespace EmberNs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Iterator base class.
|
||||||
|
/// Iterating is one loop level outside of the inner xform application loop so it's still very important
|
||||||
|
/// to take every optimization possible here.
|
||||||
|
/// The original had many temporary assignments in order to feed the output of the current iteration
|
||||||
|
/// into the input of the next iteration. All unneccessary temporary assignments are eliminated by simply using i and i + 1
|
||||||
|
/// as the input and output indices on the samples array passed to Xform.Apply().
|
||||||
|
/// Note that the samples array is assigned to while fusing. Although this technically doesn't make sense
|
||||||
|
/// since values computed during fusing get thrown out, it doesn't matter because it will get overwritten
|
||||||
|
/// in the actual loop below it since the index counter is reset to zero when fusing is complete.
|
||||||
|
/// Flam3 needlessly computed the final xform on each fuse iteration only to throw it away. It's omitted here as an optimization.
|
||||||
|
/// Rather than place many conditionals inside the iteration loop, they are broken into separate classes depending
|
||||||
|
/// on what's contained in the ember's xforms.
|
||||||
|
/// The biggest difference is whether xaos is present or not it requires extra work when picking
|
||||||
|
/// the next random xform to use. Further, each of those is broken into two loops, one for embers with a final xform
|
||||||
|
/// and one without.
|
||||||
|
/// Last, the fuse loop and real loop are separated and duplicated to omit the conditional check for fuse inside the real loop.
|
||||||
|
/// Although this makes this file about four times as verbose as it would normally be, it does lead to performance improvements.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API Iterator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Empty constructor.
|
||||||
|
/// </summary>
|
||||||
|
Iterator()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Empty virtual destructor so proper derived class destructors get called.
|
||||||
|
/// </summary>
|
||||||
|
virtual ~Iterator()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Accessors.
|
||||||
|
/// </summary>
|
||||||
|
const unsigned char* XformDistributions() const { return m_XformDistributions.empty() ? NULL : &m_XformDistributions[0]; }
|
||||||
|
const unsigned int XformDistributionsSize() const { return (unsigned int)m_XformDistributions.size(); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Virtual empty iteration function that will be overidden in derived iterator classes.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ember">The ember whose xforms will be applied</param>
|
||||||
|
/// <param name="count">The number of iterations to do</param>
|
||||||
|
/// <param name="skip">The number of times to fuse</param>
|
||||||
|
/// <param name="samples">The buffer to store the output points</param>
|
||||||
|
/// <param name="rand">The random context to use</param>
|
||||||
|
/// <returns>The number of bad values</returns>
|
||||||
|
virtual unsigned int Iterate(Ember<T>& ember, unsigned int count, unsigned int skip, Point<T>* samples, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand) { return 0; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initialize the xform selection vector by normalizing the weights of all xforms and
|
||||||
|
/// setting the corresponding percentage of elements in the vector to each xform's index in its
|
||||||
|
/// parent ember.
|
||||||
|
/// Note that this method of looking up and index in a vector is how flam3 did it and is about 10%
|
||||||
|
/// faster than using a while loop to check a random number against a normalized weight.
|
||||||
|
/// Also, the ember used to initialize this must be the same ember, unchanged, used to iterate.
|
||||||
|
/// If one is passed to this function, its parameters are changed and then it's passed to Iterate(),
|
||||||
|
/// the behavior is undefined.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ember">The ember whose xforms will be used to populate the distribution vector</param>
|
||||||
|
/// <returns>True if success, else false.</returns>
|
||||||
|
bool InitDistributions(Ember<T>& ember)
|
||||||
|
{
|
||||||
|
unsigned int i, j = 0;
|
||||||
|
unsigned int distribCount = ember.XaosPresent() ? (unsigned int)ember.XformCount() + 1 : 1;
|
||||||
|
const Xform<T>* xforms = ember.Xforms();
|
||||||
|
|
||||||
|
if (m_XformDistributions.size() < CHOOSE_XFORM_GRAIN * distribCount)
|
||||||
|
m_XformDistributions.resize(CHOOSE_XFORM_GRAIN * distribCount);
|
||||||
|
|
||||||
|
if (m_XformDistributions.size() < CHOOSE_XFORM_GRAIN * distribCount)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (unsigned int distrib = 0; distrib < distribCount; distrib++)
|
||||||
|
{
|
||||||
|
T totalDensity = 0;
|
||||||
|
|
||||||
|
//First find the total densities of all xforms.
|
||||||
|
for (i = 0; i < ember.XformCount(); i++)
|
||||||
|
{
|
||||||
|
T d = xforms[i].m_Weight;
|
||||||
|
|
||||||
|
if (distrib > 0)
|
||||||
|
d *= xforms[distrib - 1].Xaos(i);
|
||||||
|
|
||||||
|
//Original returned false if any xform had 0 density, it's allowed here
|
||||||
|
//because it can be useful when experimenting to test the effects of removing an
|
||||||
|
//xform by setting its probability to 0.
|
||||||
|
|
||||||
|
totalDensity += d;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Original returned false if all were 0, but it's allowed here
|
||||||
|
//which will just end up setting all elements to 0 which means
|
||||||
|
//only the first xform will get used.
|
||||||
|
|
||||||
|
//Calculate how much of a fraction of a the total density each element represents.
|
||||||
|
T densityPerElement = totalDensity / CHOOSE_XFORM_GRAIN;
|
||||||
|
j = 0;
|
||||||
|
|
||||||
|
//Assign xform indices in order to each element of m_XformDistributions.
|
||||||
|
//The number of elements assigned a given index is proportional to that xform's
|
||||||
|
//density relative to the sum of all densities.
|
||||||
|
for (i = 0; i < ember.XformCount(); i++)
|
||||||
|
{
|
||||||
|
T tempDensity = 0;
|
||||||
|
T currentDensityLimit = xforms[i].m_Weight;
|
||||||
|
|
||||||
|
if (distrib > 0)
|
||||||
|
currentDensityLimit *= xforms[distrib - 1].Xaos(i);
|
||||||
|
|
||||||
|
//Populate points corresponding to this xform's weight/density.
|
||||||
|
//Also check that j is within the bounds of the distribution array just to be safe in the case of a rounding error.
|
||||||
|
while (tempDensity <= currentDensityLimit && j < CHOOSE_XFORM_GRAIN)
|
||||||
|
{
|
||||||
|
m_XformDistributions[(distrib * CHOOSE_XFORM_GRAIN) + j] = i;
|
||||||
|
tempDensity += densityPerElement;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// <summary>
|
||||||
|
/// When iterating, if the computed location of the point is either very close to zero, or very close to infinity,
|
||||||
|
/// it's considered a bad value. In that case, a new random input point is fed into a new randomly chosen xform. This
|
||||||
|
/// process is repeated up to 5 times until a good value is computed. If after 5 tries, a good value is not found, then
|
||||||
|
/// the coordinates of the output point are just set to a random number between -1 and 1.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="xforms">The xforms array</param>
|
||||||
|
/// <param name="badVals">The counter for the total number of bad values this sub batch</param>
|
||||||
|
/// <param name="point">The point which initially had the bad values and which will store the newly computed values</param>
|
||||||
|
/// <param name="rand">The random context this iterator is using</param>
|
||||||
|
/// <returns>True if a good value was computed within 5 tries, else false</returns>
|
||||||
|
inline bool DoBadVals(Xform<T>* xforms, unsigned int& badVals, Point<T>* point, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand)
|
||||||
|
{
|
||||||
|
unsigned int xformIndex, consec = 0;
|
||||||
|
Point<T> firstBadPoint;
|
||||||
|
|
||||||
|
while (consec < 5)
|
||||||
|
{
|
||||||
|
consec++;
|
||||||
|
badVals++;
|
||||||
|
firstBadPoint.m_X = rand.Frand11<T>();//Re-randomize points, but keep the computed color and viz.
|
||||||
|
firstBadPoint.m_Y = rand.Frand11<T>();
|
||||||
|
firstBadPoint.m_Z = 0;
|
||||||
|
firstBadPoint.m_ColorX = point->m_ColorX;
|
||||||
|
firstBadPoint.m_VizAdjusted = point->m_VizAdjusted;
|
||||||
|
|
||||||
|
xformIndex = NextXformFromIndex(rand.Rand());
|
||||||
|
|
||||||
|
if (!xforms[xformIndex].Apply(&firstBadPoint, point, rand))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//After 5 tries, nothing worked, so just assign random values between -1 and 1.
|
||||||
|
if (consec == 5)
|
||||||
|
{
|
||||||
|
point->m_X = rand.Frand11<T>();
|
||||||
|
point->m_Y = rand.Frand11<T>();
|
||||||
|
point->m_Z = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Apply the final xform.
|
||||||
|
/// Note that as stated in the paper, the output of the final xform is not fed back into the next iteration.
|
||||||
|
/// Rather, only the value computed from the randomly chosen xform is. However, the output of the final xform
|
||||||
|
/// is still saved in the output samples buffer and accumulated to the histogram later.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ember">The ember being iterated</param>
|
||||||
|
/// <param name="tempPoint">The input point</param>
|
||||||
|
/// <param name="sample">The output point</param>
|
||||||
|
/// <param name="rand">The random context to use.</param>
|
||||||
|
inline void DoFinalXform(Ember<T>& ember, Point<T>& tempPoint, Point<T>* sample, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand)
|
||||||
|
{
|
||||||
|
if (IsClose<T>(ember.FinalXform()->m_Opacity, 1) || rand.Frand01<T>() < ember.FinalXform()->m_Opacity)
|
||||||
|
{
|
||||||
|
T tempVizAdjusted = tempPoint.m_VizAdjusted;
|
||||||
|
|
||||||
|
ember.NonConstFinalXform()->Apply(&tempPoint, sample, rand);
|
||||||
|
sample->m_VizAdjusted = tempVizAdjusted;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieve an element in the distributions vector between 0 and CHOOSE_XFORM_GRAIN which will
|
||||||
|
/// contain the index of the next xform to use. When xaos is prsent, the offset is the index in
|
||||||
|
/// the ember of the previous xform used when.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="index">The index to retrieve</param>
|
||||||
|
/// <param name="distribOffset">When xaos is prsent, the index of the previous xform used. Default: 0 (xaos not present).</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
unsigned int NextXformFromIndex(unsigned int index, unsigned int distribOffset = 0)
|
||||||
|
{
|
||||||
|
return (unsigned int)m_XformDistributions[(index % CHOOSE_XFORM_GRAIN) + (CHOOSE_XFORM_GRAIN * distribOffset)];
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<unsigned char> m_XformDistributions;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derived iterator class for embers whose xforms do not use xaos.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API StandardIterator : public Iterator<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Empty constructor.
|
||||||
|
/// </summary>
|
||||||
|
StandardIterator()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Overridden virtual function which iterates an ember a given number of times and does not use xaos.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ember">The ember whose xforms will be applied</param>
|
||||||
|
/// <param name="count">The number of iterations to do</param>
|
||||||
|
/// <param name="skip">The number of times to fuse</param>
|
||||||
|
/// <param name="samples">The buffer to store the output points</param>
|
||||||
|
/// <param name="rand">The random context to use</param>
|
||||||
|
/// <returns>The number of bad values</returns>
|
||||||
|
virtual unsigned int Iterate(Ember<T>& ember, unsigned int count, unsigned int skip, Point<T>* samples, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand)
|
||||||
|
{
|
||||||
|
unsigned int i, badVals = 0;
|
||||||
|
Point<T> tempPoint, p1;
|
||||||
|
Xform<T>* xforms = ember.NonConstXforms();
|
||||||
|
|
||||||
|
if (ember.ProjBits())
|
||||||
|
{
|
||||||
|
if (ember.UseFinalXform())
|
||||||
|
{
|
||||||
|
p1 = samples[0];
|
||||||
|
|
||||||
|
for (i = 0; i < skip; i++)//Fuse.
|
||||||
|
{
|
||||||
|
if (xforms[NextXformFromIndex(rand.Rand())].Apply(&p1, &p1, rand))
|
||||||
|
DoBadVals(xforms, badVals, &p1, rand);
|
||||||
|
}
|
||||||
|
|
||||||
|
DoFinalXform(ember, p1, samples, rand);//Apply to last fuse point and store as the first element in samples.
|
||||||
|
ember.Proj(samples[0], rand);
|
||||||
|
|
||||||
|
for (i = 1; i < count; i++)//Real loop.
|
||||||
|
{
|
||||||
|
if (xforms[NextXformFromIndex(rand.Rand())].Apply(&p1, &p1, rand))
|
||||||
|
DoBadVals(xforms, badVals, &p1, rand);
|
||||||
|
|
||||||
|
DoFinalXform(ember, p1, samples + i, rand);
|
||||||
|
ember.Proj(samples[i], rand);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p1 = samples[0];
|
||||||
|
|
||||||
|
for (i = 0; i < skip; i++)//Fuse.
|
||||||
|
{
|
||||||
|
if (xforms[NextXformFromIndex(rand.Rand())].Apply(&p1, &p1, rand))
|
||||||
|
DoBadVals(xforms, badVals, &p1, rand);
|
||||||
|
}
|
||||||
|
|
||||||
|
samples[0] = p1;
|
||||||
|
ember.Proj(samples[0], rand);
|
||||||
|
|
||||||
|
for (i = 1; i < count; i++)//Real loop.
|
||||||
|
{
|
||||||
|
if (xforms[NextXformFromIndex(rand.Rand())].Apply(&p1, &samples[i], rand))
|
||||||
|
DoBadVals(xforms, badVals, samples + i, rand);
|
||||||
|
|
||||||
|
p1 = samples[i];
|
||||||
|
ember.Proj(samples[i], rand);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (ember.UseFinalXform())
|
||||||
|
{
|
||||||
|
p1 = samples[0];
|
||||||
|
|
||||||
|
for (i = 0; i < skip; i++)//Fuse.
|
||||||
|
{
|
||||||
|
if (xforms[NextXformFromIndex(rand.Rand())].Apply(&p1, &p1, rand))
|
||||||
|
DoBadVals(xforms, badVals, &p1, rand);
|
||||||
|
}
|
||||||
|
|
||||||
|
DoFinalXform(ember, p1, samples, rand);//Apply to last fuse point and store as the first element in samples.
|
||||||
|
|
||||||
|
for (i = 1; i < count; i++)//Real loop.
|
||||||
|
{
|
||||||
|
if (xforms[NextXformFromIndex(rand.Rand())].Apply(&p1, &p1, rand))//Feed the resulting value of applying the randomly selected xform back into the next iter, and not the result of applying the final xform.
|
||||||
|
DoBadVals(xforms, badVals, &p1, rand);
|
||||||
|
|
||||||
|
DoFinalXform(ember, p1, samples + i, rand);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p1 = samples[0];
|
||||||
|
|
||||||
|
for (i = 0; i < skip; i++)//Fuse.
|
||||||
|
{
|
||||||
|
if (xforms[NextXformFromIndex(rand.Rand())].Apply(&p1, &p1, rand))
|
||||||
|
DoBadVals(xforms, badVals, &p1, rand);
|
||||||
|
}
|
||||||
|
|
||||||
|
samples[0] = p1;
|
||||||
|
|
||||||
|
for (i = 0; i < count - 1; i++)//Real loop.
|
||||||
|
if (xforms[NextXformFromIndex(rand.Rand())].Apply(samples + i, samples + i + 1, rand))
|
||||||
|
DoBadVals(xforms, badVals, samples + i + 1, rand);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return badVals;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derived iterator class for embers whose xforms use xaos.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API XaosIterator : public Iterator<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Empty constructor.
|
||||||
|
/// </summary>
|
||||||
|
XaosIterator()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handler for bad values similar to the one in the base class, except it takes the last xform used
|
||||||
|
/// as a parameter and saves the xform used back out because this iterator is meant to be used with xaos.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="xforms">The xforms array</param>
|
||||||
|
/// <param name="xformIndex">Index of the last used xform before calling this function</param>
|
||||||
|
/// <param name="lastXformUsed">The saved index of the last xform used within this function</param>
|
||||||
|
/// <param name="badVals">The counter for the total number of bad values this sub batch</param>
|
||||||
|
/// <param name="point">The point which initially had the bad values and which will store the newly computed values</param>
|
||||||
|
/// <param name="rand">The random context this iterator is using</param>
|
||||||
|
/// <returns>True if a good value was computed within 5 tries, else false</returns>
|
||||||
|
inline bool DoBadVals(Xform<T>* xforms, unsigned int& xformIndex, unsigned int lastXformUsed, unsigned int& badVals, Point<T>* point, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand)
|
||||||
|
{
|
||||||
|
unsigned int consec = 0;
|
||||||
|
Point<T> firstBadPoint;
|
||||||
|
|
||||||
|
while (consec < 5)
|
||||||
|
{
|
||||||
|
consec++;
|
||||||
|
badVals++;
|
||||||
|
firstBadPoint.m_X = rand.Frand11<T>();//Re-randomize points, but keep the computed color and viz.
|
||||||
|
firstBadPoint.m_Y = rand.Frand11<T>();
|
||||||
|
firstBadPoint.m_Z = 0;
|
||||||
|
firstBadPoint.m_ColorX = point->m_ColorX;
|
||||||
|
firstBadPoint.m_VizAdjusted = point->m_VizAdjusted;
|
||||||
|
|
||||||
|
xformIndex = NextXformFromIndex(rand.Rand(), lastXformUsed);
|
||||||
|
|
||||||
|
if (!xforms[xformIndex].Apply(&firstBadPoint, point, rand))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//After 5 tries, nothing worked, so just assign random.
|
||||||
|
if (consec == 5)
|
||||||
|
{
|
||||||
|
point->m_X = rand.Frand11<T>();
|
||||||
|
point->m_Y = rand.Frand11<T>();
|
||||||
|
point->m_Z = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Overridden virtual function which iterates an ember a given number of times and uses xaos.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ember">The ember whose xforms will be applied</param>
|
||||||
|
/// <param name="count">The number of iterations to do</param>
|
||||||
|
/// <param name="skip">The number of times to fuse</param>
|
||||||
|
/// <param name="samples">The buffer to store the output points</param>
|
||||||
|
/// <param name="rand">The random context to use</param>
|
||||||
|
/// <returns>The number of bad values</returns>
|
||||||
|
virtual unsigned int Iterate(Ember<T>& ember, unsigned int count, unsigned int skip, Point<T>* samples, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand)
|
||||||
|
{
|
||||||
|
unsigned int i, xformIndex;
|
||||||
|
unsigned int lastXformUsed = 0;
|
||||||
|
unsigned int badVals = 0;
|
||||||
|
Point<T> tempPoint, p1;
|
||||||
|
Xform<T>* xforms = ember.NonConstXforms();
|
||||||
|
|
||||||
|
if (ember.ProjBits())
|
||||||
|
{
|
||||||
|
if (ember.UseFinalXform())
|
||||||
|
{
|
||||||
|
p1 = samples[0];
|
||||||
|
|
||||||
|
for (i = 0; i < skip; i++)//Fuse.
|
||||||
|
{
|
||||||
|
xformIndex = NextXformFromIndex(rand.Rand(), lastXformUsed);
|
||||||
|
|
||||||
|
if (xforms[xformIndex].Apply(&p1, &p1, rand))
|
||||||
|
DoBadVals(xforms, xformIndex, lastXformUsed, badVals, &p1, rand);
|
||||||
|
|
||||||
|
lastXformUsed = xformIndex + 1;//Store the last used transform.
|
||||||
|
}
|
||||||
|
|
||||||
|
DoFinalXform(ember, p1, samples, rand);//Apply to last fuse point and store as the first element in samples.
|
||||||
|
ember.Proj(samples[0], rand);
|
||||||
|
|
||||||
|
for (i = 1; i < count; i++)//Real loop.
|
||||||
|
{
|
||||||
|
xformIndex = NextXformFromIndex(rand.Rand(), lastXformUsed);
|
||||||
|
|
||||||
|
if (xforms[xformIndex].Apply(&p1, &p1, rand))//Feed the resulting value of applying the randomly selected xform back into the next iter, and not the result of applying the final xform.
|
||||||
|
DoBadVals(xforms, xformIndex, lastXformUsed, badVals, &p1, rand);
|
||||||
|
|
||||||
|
DoFinalXform(ember, p1, samples + i, rand);
|
||||||
|
ember.Proj(samples[i], rand);
|
||||||
|
lastXformUsed = xformIndex + 1;//Store the last used transform.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p1 = samples[0];
|
||||||
|
|
||||||
|
for (i = 0; i < skip; i++)//Fuse.
|
||||||
|
{
|
||||||
|
xformIndex = NextXformFromIndex(rand.Rand(), lastXformUsed);
|
||||||
|
|
||||||
|
if (xforms[xformIndex].Apply(&p1, &p1, rand))
|
||||||
|
DoBadVals(xforms, xformIndex, lastXformUsed, badVals, &p1, rand);
|
||||||
|
|
||||||
|
lastXformUsed = xformIndex + 1;//Store the last used transform.
|
||||||
|
}
|
||||||
|
|
||||||
|
ember.Proj(p1, rand);
|
||||||
|
samples[0] = p1;
|
||||||
|
|
||||||
|
for (i = 1; i < count; i++)//Real loop.
|
||||||
|
{
|
||||||
|
xformIndex = NextXformFromIndex(rand.Rand(), lastXformUsed);
|
||||||
|
|
||||||
|
if (xforms[xformIndex].Apply(&p1, &p1, rand))
|
||||||
|
DoBadVals(xforms, xformIndex, lastXformUsed, badVals, &p1, rand);
|
||||||
|
|
||||||
|
samples[i] = p1;
|
||||||
|
ember.Proj(samples[i], rand);
|
||||||
|
lastXformUsed = xformIndex + 1;//Store the last used transform.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (ember.UseFinalXform())
|
||||||
|
{
|
||||||
|
p1 = samples[0];
|
||||||
|
|
||||||
|
for (i = 0; i < skip; i++)//Fuse.
|
||||||
|
{
|
||||||
|
xformIndex = NextXformFromIndex(rand.Rand(), lastXformUsed);
|
||||||
|
|
||||||
|
if (xforms[xformIndex].Apply(&p1, &p1, rand))
|
||||||
|
DoBadVals(xforms, xformIndex, lastXformUsed, badVals, &p1, rand);
|
||||||
|
|
||||||
|
lastXformUsed = xformIndex + 1;//Store the last used transform.
|
||||||
|
}
|
||||||
|
|
||||||
|
DoFinalXform(ember, p1, samples, rand);//Apply to last fuse point and store as the first element in samples.
|
||||||
|
|
||||||
|
for (i = 1; i < count; i++)//Real loop.
|
||||||
|
{
|
||||||
|
xformIndex = NextXformFromIndex(rand.Rand(), lastXformUsed);
|
||||||
|
|
||||||
|
if (xforms[xformIndex].Apply(&p1, &p1, rand))//Feed the resulting value of applying the randomly selected xform back into the next iter, and not the result of applying the final xform.
|
||||||
|
DoBadVals(xforms, xformIndex, lastXformUsed, badVals, &p1, rand);
|
||||||
|
|
||||||
|
DoFinalXform(ember, p1, samples + i, rand);
|
||||||
|
lastXformUsed = xformIndex + 1;//Store the last used transform.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p1 = samples[0];
|
||||||
|
|
||||||
|
for (i = 0; i < skip; i++)//Fuse.
|
||||||
|
{
|
||||||
|
xformIndex = NextXformFromIndex(rand.Rand(), lastXformUsed);
|
||||||
|
|
||||||
|
if (xforms[xformIndex].Apply(&p1, &p1, rand))
|
||||||
|
DoBadVals(xforms, xformIndex, lastXformUsed, badVals, &p1, rand);
|
||||||
|
|
||||||
|
lastXformUsed = xformIndex + 1;//Store the last used transform.
|
||||||
|
}
|
||||||
|
|
||||||
|
samples[0] = p1;
|
||||||
|
|
||||||
|
for (i = 0; i < count - 1; i++)//Real loop.
|
||||||
|
{
|
||||||
|
xformIndex = NextXformFromIndex(rand.Rand(), lastXformUsed);
|
||||||
|
|
||||||
|
if (xforms[xformIndex].Apply(samples + i, samples + i + 1, rand))
|
||||||
|
DoBadVals(xforms, xformIndex, lastXformUsed, badVals, samples + i + 1, rand);
|
||||||
|
|
||||||
|
lastXformUsed = xformIndex + 1;//Store the last used transform.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return badVals;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
571
Source/Ember/Palette.h
Normal file
571
Source/Ember/Palette.h
Normal file
@ -0,0 +1,571 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Utils.h"
|
||||||
|
#include "Isaac.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Palette class.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberNs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The palette stores a set of 256 colors which are what get accumulated to the histogram
|
||||||
|
/// for each iteration. The colors come from either the main palette Xml file or directly
|
||||||
|
/// from the ember parameter file. Either way, they come in as 0-255 and get normalized to 0-1.
|
||||||
|
/// In the future, 2D palette support might be added in which case this class will have to be modified.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API Palette
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which sets the palette index to random and allocates space to hold the color entries.
|
||||||
|
/// </summary>
|
||||||
|
Palette()
|
||||||
|
{
|
||||||
|
m_Name = "-";
|
||||||
|
m_Index = -1;
|
||||||
|
m_Entries.resize(COLORMAP_LENGTH);
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor that takes a name various parameters. If no color buffer is specified, a default is used.
|
||||||
|
/// This is a safety fallback, and it's highly recommended to always supply a buffer of color entries.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name of the palette</param>
|
||||||
|
/// <param name="index">The index in the palette file</param>
|
||||||
|
/// <param name="size">The size of the palette which should be 256</param>
|
||||||
|
/// <param name="xmlPaletteEntries">A pointer to 256 color entries</param>
|
||||||
|
Palette(string name, int index, unsigned int size, v4T* xmlPaletteEntries)
|
||||||
|
{
|
||||||
|
m_Name = name;
|
||||||
|
m_Index = index;
|
||||||
|
m_Entries.resize(size);
|
||||||
|
|
||||||
|
if (xmlPaletteEntries)
|
||||||
|
{
|
||||||
|
memcpy(&m_Entries[0], xmlPaletteEntries, Size() * sizeof(m_Entries[0]));
|
||||||
|
}
|
||||||
|
else//They passed in null, so just fill with hard coded values so they at least have something.
|
||||||
|
{
|
||||||
|
//Palette 15 used in the test ember file.
|
||||||
|
unsigned char palette15[COLORMAP_LENGTH * 4] = {
|
||||||
|
0x00, 0xda, 0xde, 0xbc, 0x00, 0xee, 0xe6, 0xc5, 0x00, 0xee, 0xf2, 0xce, 0x00, 0xee, 0xf2, 0xcf, 0x00, 0xe6, 0xee, 0xe1, 0x00, 0xea, 0xee, 0xd8, 0x00, 0xf2, 0xf1, 0xeb, 0x00, 0xf2, 0xf5, 0xd8,
|
||||||
|
0x00, 0xe6, 0xf2, 0xce, 0x00, 0xde, 0xea, 0xc5, 0x00, 0xd6, 0xda, 0xc6, 0x00, 0xce, 0xd2, 0xbc, 0x00, 0xc2, 0xca, 0xa9, 0x00, 0xbe, 0xca, 0xa0, 0x00, 0xce, 0xd6, 0xaa, 0x00, 0xde, 0xe2, 0xc5,
|
||||||
|
0x00, 0xea, 0xed, 0xce, 0x00, 0xea, 0xf2, 0xc5, 0x00, 0xde, 0xe2, 0xc5, 0x00, 0xc2, 0xca, 0xaa, 0x00, 0xae, 0xbe, 0xaa, 0x00, 0xa5, 0xb2, 0x96, 0x00, 0xa2, 0xa9, 0x8d, 0x00, 0x96, 0xa2, 0x84,
|
||||||
|
0x00, 0x8d, 0x8d, 0x7a, 0x00, 0x85, 0x89, 0x71, 0x00, 0x85, 0x8d, 0x71, 0x00, 0x85, 0x85, 0x67, 0x00, 0x79, 0x7d, 0x67, 0x00, 0x79, 0x7d, 0x67, 0x00, 0x71, 0x79, 0x5e, 0x00, 0x65, 0x6d, 0x55,
|
||||||
|
0x00, 0x4d, 0x5d, 0x42, 0x00, 0x34, 0x40, 0x25, 0x00, 0x30, 0x40, 0x25, 0x00, 0x30, 0x38, 0x1c, 0x00, 0x2c, 0x3c, 0x1c, 0x00, 0x2c, 0x34, 0x1c, 0x00, 0x24, 0x2c, 0x12, 0x00, 0x24, 0x24, 0x00,
|
||||||
|
0x00, 0x24, 0x2c, 0x09, 0x00, 0x28, 0x34, 0x09, 0x00, 0x38, 0x40, 0x12, 0x00, 0x30, 0x40, 0x1c, 0x00, 0x40, 0x50, 0x2f, 0x00, 0x55, 0x69, 0x42, 0x00, 0x65, 0x75, 0x55, 0x00, 0x6c, 0x7d, 0x5e,
|
||||||
|
0x00, 0x74, 0x8d, 0x71, 0x00, 0x74, 0x89, 0x84, 0x00, 0x74, 0x8d, 0x84, 0x00, 0x78, 0x8d, 0x84, 0x00, 0x79, 0x89, 0x7a, 0x00, 0x79, 0x85, 0x71, 0x00, 0x75, 0x7d, 0x67, 0x00, 0x71, 0x79, 0x5e,
|
||||||
|
0x00, 0x6c, 0x71, 0x5e, 0x00, 0x6d, 0x70, 0x5e, 0x00, 0x6c, 0x79, 0x5e, 0x00, 0x68, 0x75, 0x5e, 0x00, 0x69, 0x71, 0x55, 0x00, 0x6d, 0x75, 0x55, 0x00, 0x6d, 0x75, 0x55, 0x00, 0x69, 0x71, 0x55,
|
||||||
|
0x00, 0x65, 0x71, 0x55, 0x00, 0x69, 0x6d, 0x55, 0x00, 0x64, 0x71, 0x5e, 0x00, 0x68, 0x70, 0x67, 0x00, 0x68, 0x70, 0x67, 0x00, 0x68, 0x6c, 0x67, 0x00, 0x6c, 0x6c, 0x5e, 0x00, 0x71, 0x71, 0x5e,
|
||||||
|
0x00, 0x79, 0x79, 0x67, 0x00, 0x81, 0x85, 0x71, 0x00, 0x7d, 0x91, 0x71, 0x00, 0x85, 0x92, 0x7a, 0x00, 0x85, 0x92, 0x7a, 0x00, 0x7d, 0x92, 0x84, 0x00, 0x79, 0x92, 0x84, 0x00, 0x78, 0x92, 0x8d,
|
||||||
|
0x00, 0x78, 0x8d, 0x8d, 0x00, 0x74, 0x8d, 0x84, 0x00, 0x74, 0x92, 0x84, 0x00, 0x75, 0x92, 0x7a, 0x00, 0x6c, 0x85, 0x67, 0x00, 0x64, 0x79, 0x5e, 0x00, 0x59, 0x69, 0x4b, 0x00, 0xaa, 0x57, 0x00,
|
||||||
|
0x00, 0x38, 0x44, 0x1c, 0x00, 0x30, 0x3c, 0x1c, 0x00, 0x2c, 0x3c, 0x1c, 0x00, 0x34, 0x40, 0x25, 0x00, 0x50, 0x61, 0x4b, 0x00, 0x5d, 0x6d, 0x5e, 0x00, 0x64, 0x71, 0x5e, 0x00, 0x60, 0x71, 0x5e,
|
||||||
|
0x00, 0x60, 0x75, 0x5e, 0x00, 0x68, 0x75, 0x5e, 0x00, 0x6c, 0x79, 0x5e, 0x00, 0x6c, 0x79, 0x5e, 0x00, 0x71, 0x79, 0x67, 0x00, 0x70, 0x79, 0x67, 0x00, 0x6c, 0x7d, 0x67, 0x00, 0x68, 0x79, 0x67,
|
||||||
|
0x00, 0x6c, 0x79, 0x67, 0x00, 0x6c, 0x75, 0x67, 0x00, 0x71, 0x75, 0x5e, 0x00, 0x71, 0x75, 0x5e, 0x00, 0x75, 0x79, 0x5e, 0x00, 0x75, 0x7d, 0x5e, 0x00, 0x81, 0x8d, 0x5e, 0x00, 0x8d, 0x92, 0x5e,
|
||||||
|
0x00, 0x8d, 0x92, 0x67, 0x00, 0x9a, 0x9a, 0x71, 0x00, 0x9a, 0xa2, 0x7a, 0x00, 0x9a, 0xa2, 0x7a, 0x00, 0x9a, 0xa1, 0x7a, 0x00, 0x92, 0x9a, 0x71, 0x00, 0x89, 0x92, 0x67, 0x00, 0x81, 0x85, 0x5e,
|
||||||
|
0x00, 0x7d, 0x7d, 0x55, 0x00, 0x69, 0x79, 0x4b, 0x00, 0x61, 0x6d, 0x42, 0x00, 0x44, 0x4c, 0x25, 0x00, 0x38, 0x44, 0x1c, 0x00, 0x40, 0x51, 0x25, 0x00, 0x45, 0x4d, 0x25, 0x00, 0x71, 0x6d, 0x42,
|
||||||
|
0x00, 0x79, 0x7d, 0x4b, 0x00, 0x81, 0x7d, 0x55, 0x00, 0x79, 0x79, 0x55, 0x00, 0x6d, 0x75, 0x55, 0x00, 0x69, 0x7d, 0x55, 0x00, 0x6c, 0x79, 0x5e, 0x00, 0x65, 0x79, 0x54, 0x00, 0x68, 0x79, 0x5e,
|
||||||
|
0x00, 0x64, 0x79, 0x67, 0x00, 0x64, 0x79, 0x67, 0x00, 0x68, 0x75, 0x5e, 0x00, 0x64, 0x71, 0x5e, 0x00, 0x64, 0x6c, 0x5e, 0x00, 0x65, 0x6d, 0x55, 0x00, 0x4d, 0x58, 0x42, 0x00, 0x34, 0x40, 0x25,
|
||||||
|
0x00, 0x2c, 0x38, 0x1c, 0x00, 0x20, 0x28, 0x1c, 0x00, 0x1c, 0x14, 0x09, 0x00, 0x18, 0x18, 0x00, 0x00, 0x04, 0x14, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x0c, 0x18, 0x00, 0x00, 0x1c, 0x28, 0x09,
|
||||||
|
0x00, 0x24, 0x30, 0x12, 0x00, 0x3c, 0x44, 0x25, 0x00, 0x5d, 0x65, 0x55, 0x00, 0x75, 0x79, 0x55, 0x00, 0x85, 0x89, 0x5e, 0x00, 0x89, 0x91, 0x71, 0x00, 0x96, 0xa2, 0x71, 0x00, 0x9a, 0xa2, 0x7a,
|
||||||
|
0x00, 0x9e, 0xaa, 0x7a, 0x00, 0x9e, 0xaa, 0x7a, 0x00, 0xaa, 0xae, 0x71, 0x00, 0xa6, 0xaa, 0x7a, 0x00, 0xa2, 0xaa, 0x7a, 0x00, 0xa1, 0xa5, 0x7a, 0x00, 0x96, 0x9e, 0x7a, 0x00, 0x85, 0x96, 0x7a,
|
||||||
|
0x00, 0x81, 0x92, 0x7a, 0x00, 0x78, 0x92, 0x7a, 0x00, 0x75, 0x92, 0x7a, 0x00, 0x75, 0x8d, 0x7a, 0x00, 0x70, 0x81, 0x67, 0x00, 0x7d, 0x7d, 0x67, 0x00, 0x89, 0x89, 0x67, 0x00, 0x92, 0x9a, 0x71,
|
||||||
|
0x00, 0x9e, 0xaa, 0x7a, 0x00, 0xaa, 0xb6, 0x84, 0x00, 0xb2, 0xb6, 0x8d, 0x00, 0xb6, 0xba, 0x97, 0x00, 0xc2, 0xca, 0x97, 0x00, 0xb2, 0xbe, 0x8d, 0x00, 0xb2, 0xb6, 0x8d, 0x00, 0xaa, 0xb2, 0x8d,
|
||||||
|
0x00, 0xa2, 0xae, 0x84, 0x00, 0x9a, 0xa6, 0x7a, 0x00, 0x92, 0x9e, 0x7a, 0x00, 0x85, 0x9a, 0x7a, 0x00, 0x7d, 0x96, 0x7a, 0x00, 0x7d, 0x92, 0x7a, 0x00, 0x7d, 0x92, 0x84, 0x00, 0x7d, 0x92, 0x84,
|
||||||
|
0x00, 0x81, 0x96, 0x84, 0x00, 0x85, 0x96, 0x84, 0x00, 0x85, 0x96, 0x84, 0x00, 0x81, 0x92, 0x84, 0x00, 0x85, 0x9a, 0x84, 0x00, 0x85, 0x9a, 0x84, 0x00, 0x8d, 0x9a, 0x84, 0x00, 0x92, 0x96, 0x84,
|
||||||
|
0x00, 0x9e, 0xa9, 0x84, 0x00, 0xae, 0xb2, 0x84, 0x00, 0xaa, 0xba, 0x84, 0x00, 0xb2, 0xbe, 0x8d, 0x00, 0xb6, 0xc2, 0xa0, 0x00, 0xc6, 0xca, 0xa0, 0x00, 0xc6, 0xce, 0xaa, 0x00, 0xd6, 0xda, 0xb3,
|
||||||
|
0x00, 0xda, 0xe2, 0xc5, 0x00, 0xd2, 0xd6, 0xbc, 0x00, 0xbe, 0xc2, 0xa0, 0x00, 0xaa, 0xb6, 0x8d, 0x00, 0x9e, 0xa6, 0x7a, 0x00, 0x92, 0x9a, 0x71, 0x00, 0x89, 0x89, 0x71, 0x00, 0x81, 0x7d, 0x67,
|
||||||
|
0x00, 0x7d, 0x7d, 0x67, 0x00, 0x81, 0x78, 0x67, 0x00, 0x7d, 0x7d, 0x5e, 0x00, 0x79, 0x79, 0x5e, 0x00, 0x79, 0x81, 0x5e, 0x00, 0x81, 0x7d, 0x67, 0x00, 0x81, 0x7d, 0x67, 0x00, 0x81, 0x81, 0x67,
|
||||||
|
0x00, 0x81, 0x89, 0x71, 0x00, 0x85, 0x91, 0x7a, 0x00, 0x89, 0x92, 0x7a, 0x00, 0x96, 0x9d, 0x7a, 0x00, 0x96, 0x9e, 0x7a, 0x00, 0x92, 0x96, 0x84, 0x00, 0x96, 0x9a, 0x8d, 0x00, 0x92, 0x92, 0x84,
|
||||||
|
0x00, 0x89, 0x91, 0x84, 0x00, 0x81, 0x92, 0x84, 0x00, 0x7d, 0x92, 0x8d, 0x00, 0x78, 0x92, 0x8d, 0x00, 0x74, 0x92, 0x8d, 0x00, 0x78, 0x92, 0x8d, 0x00, 0x78, 0x96, 0x97, 0x00, 0x81, 0x96, 0x8d,
|
||||||
|
0x00, 0x81, 0x96, 0x8d, 0x00, 0x81, 0x9a, 0x8d, 0x00, 0x85, 0x9a, 0x8d, 0x00, 0x89, 0x9e, 0x8d, 0x00, 0x89, 0x9e, 0x8d, 0x00, 0x8d, 0xa2, 0x97, 0x00, 0x95, 0xa2, 0x97, 0x00, 0x8d, 0xa2, 0x97,
|
||||||
|
0x00, 0x96, 0xa6, 0x8d, 0x00, 0x9a, 0xa1, 0x8d, 0x00, 0x9e, 0xa9, 0x84, 0x00, 0x9e, 0xa6, 0x7a, 0x00, 0xa2, 0xa5, 0x71, 0x00, 0x9e, 0xa6, 0x71, 0x00, 0x9a, 0xa6, 0x71, 0x00, 0x95, 0x9d, 0x71 };
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
m_Entries[i].a = (T)palette15[i * 4 + 0];
|
||||||
|
m_Entries[i].r = (T)palette15[i * 4 + 1];
|
||||||
|
m_Entries[i].g = (T)palette15[i * 4 + 2];
|
||||||
|
m_Entries[i].b = (T)palette15[i * 4 + 3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Default copy constructor.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="palette">The Palette object to copy</param>
|
||||||
|
Palette(const Palette<T>& palette)
|
||||||
|
{
|
||||||
|
Palette<T>::operator=<T>(palette);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copy constructor to copy a Palette object of type U.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="palette">The Palette object to copy</param>
|
||||||
|
template <typename U>
|
||||||
|
Palette(const Palette<U>& palette)
|
||||||
|
{
|
||||||
|
Palette<T>::operator=<U>(palette);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Default assignment operator.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="palette">The Palette object to copy</param>
|
||||||
|
Palette<T>& operator = (const Palette<T>& palette)
|
||||||
|
{
|
||||||
|
if (this != &palette)
|
||||||
|
Palette<T>::operator=<T>(palette);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Assignment operator to assign a Palette object of type U.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="palette">The Palette object to copy</param>
|
||||||
|
/// <returns>Reference to updated self</returns>
|
||||||
|
template <typename U>
|
||||||
|
Palette<T>& operator = (const Palette<U>& palette)
|
||||||
|
{
|
||||||
|
m_Index = palette.m_Index;
|
||||||
|
m_Name = palette.m_Name;
|
||||||
|
CopyVec(m_Entries, palette.m_Entries);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convenience [] operator to index into the color entries vector.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="i">The index to get</param>
|
||||||
|
/// <returns>The color value at the specified index</returns>
|
||||||
|
v4T& operator[] (size_t i)
|
||||||
|
{
|
||||||
|
return m_Entries[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convenience * operator to get a pointer to the beginning of the color entries vector.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The address of the first element in the color entries vector</returns>
|
||||||
|
inline v4T* operator() (void)
|
||||||
|
{
|
||||||
|
return &m_Entries[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The size of the color entries vector.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The size of the color entries vector</returns>
|
||||||
|
size_t Size() { return m_Entries.size(); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set all colors to either black or white, including the alpha channel.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="black">Set all colors to black if true, else white</param>
|
||||||
|
void Clear(bool black = true)
|
||||||
|
{
|
||||||
|
for (glm::length_t i = 0; i < Size(); i++)
|
||||||
|
{
|
||||||
|
for (glm::length_t j = 0; j < 4; j++)
|
||||||
|
{
|
||||||
|
if (black)
|
||||||
|
m_Entries[i][j] = 0;
|
||||||
|
else
|
||||||
|
m_Entries[i][j] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Make a copy of this palette, adjust for hue and store in the passed in palette.
|
||||||
|
/// This is used because one way an ember Xml can specify color is with an index in the
|
||||||
|
/// palette Xml file and a hue rotation value.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="palette">The palette to store the results in</param>
|
||||||
|
/// <param name="hue">The hue rotation to apply</param>
|
||||||
|
void MakeHueAdjustedPalette(Palette<T>& palette, T hue)
|
||||||
|
{
|
||||||
|
palette.m_Index = m_Index;
|
||||||
|
palette.m_Name = m_Name;
|
||||||
|
palette.m_Entries.resize(Size());
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < Size(); i++)
|
||||||
|
{
|
||||||
|
size_t ii = (i * 256) / COLORMAP_LENGTH;
|
||||||
|
T rgb[3], hsv[3];
|
||||||
|
|
||||||
|
rgb[0] = m_Entries[ii].r;
|
||||||
|
rgb[1] = m_Entries[ii].g;
|
||||||
|
rgb[2] = m_Entries[ii].b;
|
||||||
|
|
||||||
|
RgbToHsv(rgb, hsv);
|
||||||
|
hsv[0] += hue * T(6.0);
|
||||||
|
HsvToRgb(hsv, rgb);
|
||||||
|
|
||||||
|
//Alpha serves as merely a hit counter that gets incremented by 1 each time, see Renderer::Accumulate() for its usage.
|
||||||
|
//Removing it saves no memory since it's 16 byte aligned. This also means alpha is not used.
|
||||||
|
palette[i].r = rgb[0];
|
||||||
|
palette[i].g = rgb[1];
|
||||||
|
palette[i].b = rgb[2];
|
||||||
|
palette[i].a = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// More advanced adjustment than MakeHueAdjustedPalette() provides.
|
||||||
|
/// Adjustments are applied in the order:
|
||||||
|
/// Frequency, index rotation, hue rotation, saturation, brightness, contrast, blur.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="palette">The palette to store the result in</param>
|
||||||
|
/// <param name="rot">Index rotation.</param>
|
||||||
|
/// <param name="hue">Hue rotation -5 - 5</param>
|
||||||
|
/// <param name="sat">Saturation 0 - 1</param>
|
||||||
|
/// <param name="bright">Brightness 0 - 1</param>
|
||||||
|
/// <param name="cont">Contrast -1 - 2</param>
|
||||||
|
/// <param name="blur">Blur 0 - 127</param>
|
||||||
|
/// <param name="freq">Frequency 1 - 10</param>
|
||||||
|
void MakeAdjustedPalette(Palette<T>& palette, int rot, T hue, T sat, T bright, T cont, unsigned int blur, unsigned int freq)
|
||||||
|
{
|
||||||
|
T rgb[3], hsv[3];
|
||||||
|
|
||||||
|
if (freq > 1)
|
||||||
|
{
|
||||||
|
size_t n = Size() / freq;
|
||||||
|
|
||||||
|
for (size_t j = 0; j <= freq; j++)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i <= n; i++)
|
||||||
|
{
|
||||||
|
if ((i + j * n) < Size())
|
||||||
|
{
|
||||||
|
palette[i + j * n].r = m_Entries[i * freq].r;
|
||||||
|
palette[i + j * n].g = m_Entries[i * freq].g;
|
||||||
|
palette[i + j * n].b = m_Entries[i * freq].b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
palette.m_Name = m_Name;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
palette = *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < Size(); i++)
|
||||||
|
{
|
||||||
|
size_t ii = (i * 256) / COLORMAP_LENGTH;
|
||||||
|
|
||||||
|
rgb[0] = palette[(COLORMAP_LENGTH + ii - rot) % COLORMAP_LENGTH].r;//Rotation.
|
||||||
|
rgb[1] = palette[(COLORMAP_LENGTH + ii - rot) % COLORMAP_LENGTH].g;
|
||||||
|
rgb[2] = palette[(COLORMAP_LENGTH + ii - rot) % COLORMAP_LENGTH].b;
|
||||||
|
RgbToHsv(rgb, hsv);
|
||||||
|
hsv[0] += hue * T(6.0);//Hue.
|
||||||
|
hsv[1] = Clamp<T>(hsv[1] + sat, 0, 1);//Saturation.
|
||||||
|
HsvToRgb(hsv, rgb);
|
||||||
|
rgb[0] = Clamp<T>(rgb[0] + bright, 0, 1);//Brightness.
|
||||||
|
rgb[1] = Clamp<T>(rgb[1] + bright, 0, 1);
|
||||||
|
rgb[2] = Clamp<T>(rgb[2] + bright, 0, 1);
|
||||||
|
rgb[0] = Clamp<T>(((rgb[0] - T(0.5)) * (cont + T(1.0))) + T(0.5), 0, 1);//Contrast.
|
||||||
|
rgb[1] = Clamp<T>(((rgb[1] - T(0.5)) * (cont + T(1.0))) + T(0.5), 0, 1);
|
||||||
|
rgb[2] = Clamp<T>(((rgb[2] - T(0.5)) * (cont + T(1.0))) + T(0.5), 0, 1);
|
||||||
|
|
||||||
|
//Alpha serves as merely a hit counter that gets incremented by 1 each time, see Renderer::Accumulate() for its usage.
|
||||||
|
//Removing it saves no memory since it's 16 byte aligned.
|
||||||
|
palette[i].r = rgb[0];
|
||||||
|
palette[i].g = rgb[1];
|
||||||
|
palette[i].b = rgb[2];
|
||||||
|
palette[i].a = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (blur > 0)
|
||||||
|
{
|
||||||
|
Palette<T> blurPal = palette;
|
||||||
|
|
||||||
|
for (int i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
int n = -1;
|
||||||
|
|
||||||
|
rgb[0] = 0;
|
||||||
|
rgb[1] = 0;
|
||||||
|
rgb[2] = 0;
|
||||||
|
|
||||||
|
for (int j = i - (int)blur; j <= i + (int)blur; j++)
|
||||||
|
{
|
||||||
|
n++;
|
||||||
|
int k = (256 + j) % 256;
|
||||||
|
|
||||||
|
if (k != i)
|
||||||
|
{
|
||||||
|
rgb[0] = rgb[0] + blurPal[k].r;
|
||||||
|
rgb[1] = rgb[1] + blurPal[k].g;
|
||||||
|
rgb[2] = rgb[2] + blurPal[k].b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n != 0)
|
||||||
|
{
|
||||||
|
palette[i].r = rgb[0] / n;
|
||||||
|
palette[i].g = rgb[1] / n;
|
||||||
|
palette[i].b = rgb[2] / n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Make a copy of this palette and multiply all RGB values by a scalar.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="palette">The palette to store the result in</param>
|
||||||
|
/// <param name="colorScalar">The color scalar to multiply each RGB value by</param>
|
||||||
|
template<typename bucketT>
|
||||||
|
void MakeDmap(Palette<bucketT>& palette, T colorScalar = 1)
|
||||||
|
{
|
||||||
|
palette.m_Index = m_Index;
|
||||||
|
palette.m_Name = m_Name;
|
||||||
|
|
||||||
|
if (palette.Size() != Size())
|
||||||
|
palette.m_Entries.resize(Size());
|
||||||
|
|
||||||
|
for (unsigned int j = 0; j < palette.Size(); j++)
|
||||||
|
{
|
||||||
|
palette.m_Entries[j] = m_Entries[j] * colorScalar;
|
||||||
|
palette.m_Entries[j].a = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Make a buffer with the color values of this palette scaled to 255
|
||||||
|
/// and repeated for a number of rows.
|
||||||
|
/// Convenience function for displaying this palette on a GUI.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="height">The height of the output block</param>
|
||||||
|
/// <returns>A vector holding the color values</returns>
|
||||||
|
vector<unsigned char> MakeRgbPaletteBlock(unsigned int height)
|
||||||
|
{
|
||||||
|
size_t width = Size();
|
||||||
|
vector<unsigned char> v(height * width * 3);
|
||||||
|
|
||||||
|
if (v.size() == (height * Size() * 3))
|
||||||
|
{
|
||||||
|
for (unsigned int i = 0; i < height; i++)
|
||||||
|
{
|
||||||
|
for (unsigned int j = 0; j < width; j++)
|
||||||
|
{
|
||||||
|
v[(width * 3 * i) + (j * 3)] = (unsigned char)(m_Entries[j][0] * T(255));//Palettes are as [0..1], so convert to [0..255] here since it's for GUI display.
|
||||||
|
v[(width * 3 * i) + (j * 3) + 1] = (unsigned char)(m_Entries[j][1] * T(255));
|
||||||
|
v[(width * 3 * i) + (j * 3) + 2] = (unsigned char)(m_Entries[j][2] * T(255));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convert RGB to HSV.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="r">Red 0 - 1</param>
|
||||||
|
/// <param name="g">Green 0 - 1</param>
|
||||||
|
/// <param name="b">Blue 0 - 1</param>
|
||||||
|
/// <param name="h">Hue 0 - 6</param>
|
||||||
|
/// <param name="s">Saturation 0 - 1</param>
|
||||||
|
/// <param name="v">Value 0 - 1</param>
|
||||||
|
static void RgbToHsv(T r, T g, T b, T& h, T& s, T& v)
|
||||||
|
{
|
||||||
|
T max, min, del, rc, gc, bc;
|
||||||
|
|
||||||
|
max = std::max(std::max(r, g), b);//Compute maximum of r, g, b.
|
||||||
|
min = std::min(std::min(r, g), b);//Compute minimum of r, g, b.
|
||||||
|
|
||||||
|
del = max - min;
|
||||||
|
v = max;
|
||||||
|
s = (max != 0) ? (del / max) : 0;
|
||||||
|
h = 0;
|
||||||
|
|
||||||
|
if (s != 0)
|
||||||
|
{
|
||||||
|
rc = (max - r) / del;
|
||||||
|
gc = (max - g) / del;
|
||||||
|
bc = (max - b) / del;
|
||||||
|
|
||||||
|
if (r == max)
|
||||||
|
h = bc - gc;
|
||||||
|
else if (g == max)
|
||||||
|
h = 2 + rc - bc;
|
||||||
|
else if (b == max)
|
||||||
|
h = 4 + gc - rc;
|
||||||
|
|
||||||
|
if (h < 0)
|
||||||
|
h += 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Wrapper around RgbToHsv() which takes buffers as parameters instead of individual components.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="rgb">The RGB buffer</param>
|
||||||
|
/// <param name="hsv">The HSV buffer</param>
|
||||||
|
static void RgbToHsv(T* rgb, T* hsv)
|
||||||
|
{
|
||||||
|
RgbToHsv(rgb[0], rgb[1], rgb[2], hsv[0], hsv[1], hsv[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convert HSV to RGB.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="h">Hue 0 - 6</param>
|
||||||
|
/// <param name="s">Saturation 0 - 1</param>
|
||||||
|
/// <param name="v">Value 0 - 1</param>
|
||||||
|
/// <param name="r">Red 0 - 1</param>
|
||||||
|
/// <param name="g">Green 0 - 1</param>
|
||||||
|
/// <param name="b">Blue 0 - 1</param>
|
||||||
|
static void HsvToRgb(T h, T s, T v, T& r, T& g, T& b)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
T f, p, q, t;
|
||||||
|
|
||||||
|
while (h >= 6)
|
||||||
|
h -= 6;
|
||||||
|
|
||||||
|
while (h < 0)
|
||||||
|
h += 6;
|
||||||
|
|
||||||
|
j = Floor<T>(h);
|
||||||
|
f = h - j;
|
||||||
|
p = v * (1 - s);
|
||||||
|
q = v * (1 - (s * f));
|
||||||
|
t = v * (1 - (s * (1 - f)));
|
||||||
|
|
||||||
|
switch (j)
|
||||||
|
{
|
||||||
|
case 0: r = v; g = t; b = p; break;
|
||||||
|
case 1: r = q; g = v; b = p; break;
|
||||||
|
case 2: r = p; g = v; b = t; break;
|
||||||
|
case 3: r = p; g = q; b = v; break;
|
||||||
|
case 4: r = t; g = p; b = v; break;
|
||||||
|
case 5: r = v; g = p; b = q; break;
|
||||||
|
default: r = v; g = t; b = p; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Wrapper around HsvToRgb() which takes buffers as parameters instead of individual components.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="hsv">The HSV buffer</param>
|
||||||
|
/// <param name="rgb">The RGB buffer</param>
|
||||||
|
static void HsvToRgb(T* hsv, T* rgb)
|
||||||
|
{
|
||||||
|
HsvToRgb(hsv[0], hsv[1], hsv[2], rgb[0], rgb[1], rgb[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Calculates the alpha.
|
||||||
|
/// Used for gamma correction in final accumulation.
|
||||||
|
/// Not the slightest clue what this is doing.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="density">Density</param>
|
||||||
|
/// <param name="gamma">Gamma</param>
|
||||||
|
/// <param name="linrange">Linear range</param>
|
||||||
|
/// <returns>Alpha</returns>
|
||||||
|
static T CalcAlpha(T density, T gamma, T linrange)
|
||||||
|
{
|
||||||
|
T frac, alpha;
|
||||||
|
T funcval = pow(linrange, gamma);
|
||||||
|
|
||||||
|
if (density > 0)
|
||||||
|
{
|
||||||
|
if (density < linrange)
|
||||||
|
{
|
||||||
|
frac = density / linrange;
|
||||||
|
alpha = (T(1.0) - frac) * density * (funcval / linrange) + frac * pow(density, gamma);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
alpha = pow(density, gamma);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
alpha = 0;
|
||||||
|
|
||||||
|
return alpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Calculates the new RGB and stores in the supplied buffer.
|
||||||
|
/// Used for gamma correction in final accumulation.
|
||||||
|
/// Not the slightest clue what this is doing.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="cBuf">The input RGB color buffer 0 - 1</param>
|
||||||
|
/// <param name="ls">Log scaling</param>
|
||||||
|
/// <param name="highPow">Highlight power, -1 - 1</param>
|
||||||
|
/// <param name="newRgb">Newly computed RGB value</param>
|
||||||
|
template<typename bucketT>
|
||||||
|
static void CalcNewRgb(bucketT* cBuf, T ls, T highPow, bucketT* newRgb)
|
||||||
|
{
|
||||||
|
int rgbi;
|
||||||
|
T newls, lsratio;
|
||||||
|
bucketT newhsv[3];
|
||||||
|
T maxa, maxc;
|
||||||
|
T adjustedHighlight;
|
||||||
|
|
||||||
|
if (ls == 0 || (cBuf[0] == 0 && cBuf[1] == 0 && cBuf[2] == 0))
|
||||||
|
{
|
||||||
|
newRgb[0] = 0;
|
||||||
|
newRgb[1] = 0;
|
||||||
|
newRgb[2] = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Identify the most saturated channel.
|
||||||
|
maxc = max(max(cBuf[0], cBuf[1]), cBuf[2]);
|
||||||
|
maxa = ls * maxc;
|
||||||
|
|
||||||
|
//If a channel is saturated and highlight power is non-negative
|
||||||
|
//modify the color to prevent hue shift.
|
||||||
|
if (maxa > 255 && highPow >= 0)
|
||||||
|
{
|
||||||
|
newls = T(255.0) / maxc;
|
||||||
|
lsratio = pow(newls / ls, highPow);
|
||||||
|
|
||||||
|
//Calculate the max-value color (ranged 0 - 1).
|
||||||
|
for (rgbi = 0; rgbi < 3; rgbi++)
|
||||||
|
newRgb[rgbi] = (bucketT)newls * cBuf[rgbi] / bucketT(255.0);
|
||||||
|
|
||||||
|
//Reduce saturation by the lsratio.
|
||||||
|
Palette<bucketT>::RgbToHsv(newRgb, newhsv);
|
||||||
|
newhsv[1] *= (bucketT)lsratio;
|
||||||
|
Palette<bucketT>::HsvToRgb(newhsv, newRgb);
|
||||||
|
|
||||||
|
for (rgbi = 0; rgbi < 3; rgbi++)
|
||||||
|
newRgb[rgbi] *= T(255.0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newls = T(255.0) / maxc;
|
||||||
|
adjustedHighlight = -highPow;
|
||||||
|
|
||||||
|
if (adjustedHighlight > 1)
|
||||||
|
adjustedHighlight = 1;
|
||||||
|
|
||||||
|
if (maxa <= 255)
|
||||||
|
adjustedHighlight = 1;
|
||||||
|
|
||||||
|
//Calculate the max-value color (ranged 0 - 1) interpolated with the old behavior.
|
||||||
|
for (rgbi = 0; rgbi < 3; rgbi++)
|
||||||
|
newRgb[rgbi] = bucketT((T(1.0) - adjustedHighlight) * newls + adjustedHighlight * ls) * cBuf[rgbi];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int m_Index;//Index in the xml palette file of this palette, use -1 for random.
|
||||||
|
string m_Name;//Name of this palette.
|
||||||
|
vector<v4T> m_Entries;//Storage for the color values.
|
||||||
|
};
|
||||||
|
}
|
226
Source/Ember/PaletteList.h
Normal file
226
Source/Ember/PaletteList.h
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Palette.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// PaletteList class.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberNs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Holds a list of palettes read from an Xml file. Since the default list from flam3-palettes.xml is fairly large at 700 palettes,
|
||||||
|
/// the list member is kept as a static. This class derives from EmberReport in order to report any errors that occurred while reading the Xml.
|
||||||
|
/// Note that although the Xml color values are expected to be 0-255, they are converted and stored as normalized colors, with values from 0-1.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API PaletteList : public EmberReport
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Empty constructor which does nothing.
|
||||||
|
/// </summary>
|
||||||
|
PaletteList()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Read an Xml palette file into memory.
|
||||||
|
/// This must be called before any palette file usage.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filename">The full path to the file to read</param>
|
||||||
|
/// <param name="force">If true, override the initialization state and force a read, else observe the initialization state.</param>
|
||||||
|
/// <returns>The initialization state</returns>
|
||||||
|
bool Init(string filename, bool force = false)
|
||||||
|
{
|
||||||
|
if (!m_Init || force)
|
||||||
|
{
|
||||||
|
const char* loc = __FUNCTION__;
|
||||||
|
|
||||||
|
m_Init = false;
|
||||||
|
m_Palettes.clear();
|
||||||
|
m_ErrorReport.clear();
|
||||||
|
string buf;
|
||||||
|
|
||||||
|
if (ReadFile(filename.c_str(), buf))
|
||||||
|
{
|
||||||
|
xmlDocPtr doc = xmlReadMemory((const char*)buf.data(), (int)buf.size(), filename.c_str(), NULL, XML_PARSE_NONET);
|
||||||
|
|
||||||
|
if (doc != NULL)
|
||||||
|
{
|
||||||
|
xmlNode* rootNode = xmlDocGetRootElement(doc);
|
||||||
|
|
||||||
|
m_Palettes.reserve(buf.size() / 2048);//Roughly what it takes per palette.
|
||||||
|
ParsePalettes(rootNode);
|
||||||
|
xmlFreeDoc(doc);
|
||||||
|
m_Init = m_ErrorReport.empty();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_ErrorReport.push_back(string(loc) + " : Couldn't load xml doc");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_ErrorReport.push_back(string(loc) + " : Couldn't read palette file " + filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_Init;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the palette at a specified index.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="i">The index of the palette to read. A value of -1 indicates a random palette.</param>
|
||||||
|
/// <returns>A pointer to the requested palette if the index was in range, else NULL.</returns>
|
||||||
|
Palette<T>* GetPalette(int i)
|
||||||
|
{
|
||||||
|
if (!m_Palettes.empty())
|
||||||
|
{
|
||||||
|
if (i == -1)
|
||||||
|
return &m_Palettes[QTIsaac<ISAAC_SIZE, ISAAC_INT>::GlobalRand->Rand() % Count()];
|
||||||
|
else if (i < (int)m_Palettes.size())
|
||||||
|
return &m_Palettes[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a pointer to a palette with a specified name.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name of the palette to retrieve</param>
|
||||||
|
/// <returns>A pointer to the palette if found, else NULL</returns>
|
||||||
|
Palette<T>* GetPaletteByName(string& name)
|
||||||
|
{
|
||||||
|
for (unsigned int i = 0; i < Count(); i++)
|
||||||
|
if (m_Palettes[i].m_Name == name)
|
||||||
|
return &m_Palettes[i];
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a copy of the palette at a specified index with its hue adjusted by the specified amount.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="i">The index of the palette to read. A value of -1 indicates a random palette.</param>
|
||||||
|
/// <param name="hue">The hue adjustment to apply</param>
|
||||||
|
/// <param name="palette">The palette to store the output</param>
|
||||||
|
/// <returns>True if successful, else false.</returns>
|
||||||
|
bool GetHueAdjustedPalette(int i, T hue, Palette<T>& palette)
|
||||||
|
{
|
||||||
|
bool b = false;
|
||||||
|
Palette<T>* unadjustedPal = GetPalette(i);
|
||||||
|
|
||||||
|
if (unadjustedPal)
|
||||||
|
{
|
||||||
|
unadjustedPal->MakeHueAdjustedPalette(palette, hue);
|
||||||
|
b = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clear the palette list and reset the initialization state.
|
||||||
|
/// </summary>
|
||||||
|
void Clear()
|
||||||
|
{
|
||||||
|
m_Palettes.clear();
|
||||||
|
m_Init = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Accessors.
|
||||||
|
/// </summary>
|
||||||
|
bool Init() { return m_Init; }
|
||||||
|
unsigned int Count() { return (unsigned int)m_Palettes.size(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// <summary>
|
||||||
|
/// Parses an Xml node for all palettes present and stores in the palette list.
|
||||||
|
/// Note that although the Xml color values are expected to be 0-255, they are converted and
|
||||||
|
/// stored as normalized colors, with values from 0-1.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="node">The parent note of all palettes in the Xml file.</param>
|
||||||
|
void ParsePalettes(xmlNode* node)
|
||||||
|
{
|
||||||
|
bool hexError = false;
|
||||||
|
char* val;
|
||||||
|
const char* loc = __FUNCTION__;
|
||||||
|
xmlAttrPtr attr;
|
||||||
|
|
||||||
|
while (node)
|
||||||
|
{
|
||||||
|
if (node->type == XML_ELEMENT_NODE && !Compare(node->name, "palette"))
|
||||||
|
{
|
||||||
|
attr = node->properties;
|
||||||
|
Palette<T> palette;
|
||||||
|
|
||||||
|
while (attr)
|
||||||
|
{
|
||||||
|
val = (char*)xmlGetProp(node, attr->name);
|
||||||
|
|
||||||
|
if (!Compare(attr->name, "data"))
|
||||||
|
{
|
||||||
|
int colorIndex = 0;
|
||||||
|
int r, g, b;
|
||||||
|
int colorCount = 0;
|
||||||
|
hexError = false;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
int ret = sscanf_s((char*)&(val[colorIndex]),"00%2x%2x%2x", &r, &g, &b);
|
||||||
|
|
||||||
|
if (ret != 3)
|
||||||
|
{
|
||||||
|
m_ErrorReport.push_back(string(loc) + " : Problem reading hexadecimal color data " + string(&val[colorIndex]));
|
||||||
|
hexError = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
colorIndex += 8;
|
||||||
|
|
||||||
|
while (isspace((int)val[colorIndex]))
|
||||||
|
colorIndex++;
|
||||||
|
|
||||||
|
palette[colorCount].r = T(r) / T(255);//Store as normalized colors in the range of 0-1.
|
||||||
|
palette[colorCount].g = T(g) / T(255);
|
||||||
|
palette[colorCount].b = T(b) / T(255);
|
||||||
|
|
||||||
|
colorCount++;
|
||||||
|
} while (colorCount < COLORMAP_LENGTH);
|
||||||
|
}
|
||||||
|
else if (!Compare(attr->name, "number"))
|
||||||
|
{
|
||||||
|
palette.m_Index = atoi(val);
|
||||||
|
}
|
||||||
|
else if (!Compare(attr->name, "name"))
|
||||||
|
{
|
||||||
|
palette.m_Name = string(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlFree(val);
|
||||||
|
attr = attr->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hexError)
|
||||||
|
{
|
||||||
|
m_Palettes.push_back(palette);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ParsePalettes(node->children);
|
||||||
|
}
|
||||||
|
|
||||||
|
node = node->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool m_Init;//Initialized to false in Ember.cpp, and will be set to true upon successful reading of an Xml palette file.
|
||||||
|
static vector<Palette<T>> m_Palettes;//The vector that stores the palettes.
|
||||||
|
};
|
||||||
|
}
|
217
Source/Ember/Point.h
Normal file
217
Source/Ember/Point.h
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "EmberDefines.h"
|
||||||
|
#include "Affine2D.h"
|
||||||
|
#include "Timing.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Basic point and color structures used in iteration.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberNs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The point used to store the result of each iteration, which is
|
||||||
|
/// a spatial coordinate, a color index/coordinate and a visibility value.
|
||||||
|
/// Note that a Y color coordinate is not used at the moment because
|
||||||
|
/// only 1D palettes are supported like the original. However, in the future
|
||||||
|
/// 2D palettes may be supported like Fractron does.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API Point
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor to initialize spatial and color coordinates to zero, with full visibility.
|
||||||
|
/// </summary>
|
||||||
|
Point()
|
||||||
|
{
|
||||||
|
Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Default copy constructor.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="point">The Point object to copy</param>
|
||||||
|
Point(const Point<T>& point)
|
||||||
|
{
|
||||||
|
Point<T>::operator=<T>(point);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copy constructor to copy a Point object of type U.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="point">The Point object to copy</param>
|
||||||
|
template <typename U>
|
||||||
|
Point(const Point<U>& point)
|
||||||
|
{
|
||||||
|
Point<T>::operator=<U>(point);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Default assignment operator.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="point">The Point object to copy</param>
|
||||||
|
Point<T>& operator = (const Point<T>& point)
|
||||||
|
{
|
||||||
|
if (this != &point)
|
||||||
|
Point<T>::operator=<T>(point);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Assignment operator to assign a Point object of type U.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="point">The Point object to copy.</param>
|
||||||
|
/// <returns>Reference to updated self</returns>
|
||||||
|
template <typename U>
|
||||||
|
Point<T>& operator = (const Point<U>& point)
|
||||||
|
{
|
||||||
|
m_X = point.m_X;
|
||||||
|
m_Y = point.m_Y;
|
||||||
|
m_Z = point.m_Z;
|
||||||
|
m_ColorX = point.m_ColorX;
|
||||||
|
//m_ColorY = point.m_ColorY;
|
||||||
|
m_VizAdjusted = point.m_VizAdjusted;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set spatial and color coordinates to zero, with full visibility.
|
||||||
|
/// </summary>
|
||||||
|
void Init()
|
||||||
|
{
|
||||||
|
m_X = 0;
|
||||||
|
m_Y = 0;
|
||||||
|
m_Z = 0;
|
||||||
|
m_ColorX = 0;
|
||||||
|
//m_ColorY = 0;
|
||||||
|
m_VizAdjusted = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
T m_X;
|
||||||
|
T m_Y;
|
||||||
|
T m_Z;
|
||||||
|
T m_ColorX;
|
||||||
|
//T m_ColorY;
|
||||||
|
T m_VizAdjusted;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Comparer used for sorting the results of iteration by their spatial x coordinates.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="a">The first point to compare</param>
|
||||||
|
/// <param name="b">The second point to compare</param>
|
||||||
|
/// <returns>1 if the first point had an x coordinate less than the second point, else 0</returns>
|
||||||
|
template <typename T>
|
||||||
|
static int SortPointByX(const Point<T>& a, const Point<T>& b)
|
||||||
|
{
|
||||||
|
return a.m_X < b.m_X;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Comparer used for sorting the results of iteration by their spatial y coordinates.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="a">The first point to compare</param>
|
||||||
|
/// <param name="b">The second point to compare</param>
|
||||||
|
/// <returns>1 if the first point had an y coordinate less than the second point, else 0</returns>
|
||||||
|
template <typename T>
|
||||||
|
static int SortPointByY(const Point<T>& a, const Point<T>& b)
|
||||||
|
{
|
||||||
|
return a.m_Y < b.m_Y;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Thin override of a glm::vec4 which adds a couple of functions
|
||||||
|
/// specific to color handling.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API Color : public v4T
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor to set color values to zero, with full visibility.
|
||||||
|
/// </summary>
|
||||||
|
Color()
|
||||||
|
{
|
||||||
|
Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Default copy constructor.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="color">The Color object to copy</param>
|
||||||
|
Color(const Color<T>& color)
|
||||||
|
{
|
||||||
|
Color<T>::operator=<T>(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copy constructor to copy a Color object of type U.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="color">The Color object to copy</param>
|
||||||
|
template <typename U>
|
||||||
|
Color(const Color<U>& color)
|
||||||
|
{
|
||||||
|
Color<T>::operator=<U>(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Default assignment operator.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="color">The Color object to copy</param>
|
||||||
|
Color<T>& operator = (const Color<T>& color)
|
||||||
|
{
|
||||||
|
if (this != &color)
|
||||||
|
Color<T>::operator=<T>(color);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Assignment operator to assign a Color object of type U.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="color">The Color object to copy.</param>
|
||||||
|
/// <returns>Reference to updated self</returns>
|
||||||
|
template <typename U>
|
||||||
|
Color<T>& operator = (const Color<U>& color)
|
||||||
|
{
|
||||||
|
v4T::operator=<U>(color);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Member-wise constructor.
|
||||||
|
/// </summary>
|
||||||
|
Color(T rr, T gg, T bb, T aa)
|
||||||
|
: v4T(rr, gg, bb, aa)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set color values and visibility to zero.
|
||||||
|
/// </summary>
|
||||||
|
inline void Clear()
|
||||||
|
{
|
||||||
|
r = 0;
|
||||||
|
g = 0;
|
||||||
|
b = 0;
|
||||||
|
a = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set color values to zero, with full visibility.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="norm">If norm is true, the color fields are expected to have a range of 0-1, else 0-255</param>
|
||||||
|
inline void Reset(bool norm = true)
|
||||||
|
{
|
||||||
|
r = 0;
|
||||||
|
g = 0;
|
||||||
|
b = 0;
|
||||||
|
a = norm ? T(1) : T(255);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
2222
Source/Ember/Renderer.cpp
Normal file
2222
Source/Ember/Renderer.cpp
Normal file
File diff suppressed because it is too large
Load Diff
412
Source/Ember/Renderer.h
Normal file
412
Source/Ember/Renderer.h
Normal file
@ -0,0 +1,412 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Ember.h"
|
||||||
|
#include "Iterator.h"
|
||||||
|
#include "Utils.h"
|
||||||
|
#include "SpatialFilter.h"
|
||||||
|
#include "DensityFilter.h"
|
||||||
|
#include "TemporalFilter.h"
|
||||||
|
#include "Interpolate.h"
|
||||||
|
#include "CarToRas.h"
|
||||||
|
#include "EmberToXml.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Renderer, RenderCallback and EmberStats classes.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberNs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Function pointers present a major restriction when dealing
|
||||||
|
/// with member functions, and that is they can only point to
|
||||||
|
/// static ones. So instead of a straight function pointer, use
|
||||||
|
/// a callback class with a single virtual callback
|
||||||
|
/// member function.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
class EMBER_API RenderCallback
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Virtual destructor to ensure anything declared in derived classes gets cleaned up.
|
||||||
|
/// </summary>
|
||||||
|
virtual ~RenderCallback() { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Empty progress function to be implemented in derived classes to take action on progress updates.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ember">The ember currently being rendered</param>
|
||||||
|
/// <param name="foo">An extra dummy parameter</param>
|
||||||
|
/// <param name="fraction">The progress fraction from 0-100</param>
|
||||||
|
/// <param name="stage">The stage of iteration. 1 is iterating, 2 is density filtering, 2 is final accumulation.</param>
|
||||||
|
/// <param name="etaMs">The estimated milliseconds to completion of the current stage</param>
|
||||||
|
/// <returns>Override should return 0 if an abort is requested, else 1 to continue rendering</returns>
|
||||||
|
virtual int ProgressFunc(Ember<float>& ember, void* foo, double fraction, int stage, double etaMs) { return 0; }
|
||||||
|
virtual int ProgressFunc(Ember<double>& ember, void* foo, double fraction, int stage, double etaMs) { return 0; }
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Render statistics for the number of iterations ran,
|
||||||
|
/// number of bad values calculated during iteration, and
|
||||||
|
/// the total time for the entire render from the start of
|
||||||
|
/// iteration to the end of final accumulation.
|
||||||
|
/// </summary>
|
||||||
|
class EMBER_API EmberStats
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which sets all values to 0.
|
||||||
|
/// </summary>
|
||||||
|
EmberStats()
|
||||||
|
{
|
||||||
|
m_Iters = 0;
|
||||||
|
m_Badvals = 0;
|
||||||
|
m_RenderSeconds = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned __int64 m_Iters, m_Badvals;
|
||||||
|
double m_RenderSeconds;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The types of available renderers.
|
||||||
|
/// Add more in the future as different rendering methods are experimented with.
|
||||||
|
/// Possible values might be: CPU+OpenGL, Particle, Inverse.
|
||||||
|
/// </summary>
|
||||||
|
enum eRendererType { CPU_RENDERER, OPENCL_RENDERER };
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A base class with virtual functions to allow both templating and polymorphism to work together.
|
||||||
|
/// Derived classes will implement all of these functions.
|
||||||
|
/// Note that functions which return a decimal number use the most precise type, double.
|
||||||
|
/// </summary>
|
||||||
|
class EMBER_API RendererBase : public EmberReport
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RendererBase() { }
|
||||||
|
virtual ~RendererBase() { }
|
||||||
|
virtual void SetEmber(Ember<float>& ember, eProcessAction action = FULL_RENDER) { }
|
||||||
|
virtual void SetEmber(vector<Ember<float>>& embers) { }
|
||||||
|
virtual void SetEmber(Ember<double>& ember, eProcessAction action = FULL_RENDER) { }
|
||||||
|
virtual void SetEmber(vector<Ember<double>>& embers) { }
|
||||||
|
virtual void Callback(RenderCallback* callback) { }
|
||||||
|
virtual bool CreateSpatialFilter(bool& newAlloc) { return false; }
|
||||||
|
virtual bool CreateTemporalFilter(bool& newAlloc) { return false; }
|
||||||
|
virtual void ComputeBounds() { }
|
||||||
|
virtual bool Ok() const { return false; }
|
||||||
|
virtual void Reset() { }
|
||||||
|
virtual void EnterRender() { }
|
||||||
|
virtual void LeaveRender() { }
|
||||||
|
virtual void EnterFinalAccum() { }
|
||||||
|
virtual void LeaveFinalAccum() { }
|
||||||
|
virtual void EnterResize() { }
|
||||||
|
virtual void LeaveResize() { }
|
||||||
|
virtual void Abort() { }
|
||||||
|
virtual bool Aborted() { return false; }
|
||||||
|
virtual bool InRender() { return false; }
|
||||||
|
virtual bool InFinalAccum() { return false; }
|
||||||
|
virtual unsigned int NumChannels() const { return 0; }
|
||||||
|
virtual void NumChannels(unsigned int numChannels) { }
|
||||||
|
virtual eRendererType RendererType() const { return CPU_RENDERER; }
|
||||||
|
virtual void ReclaimOnResize(bool reclaimOnResize) { }
|
||||||
|
virtual bool EarlyClip() const { return false; }
|
||||||
|
virtual void EarlyClip(bool earlyClip) { }
|
||||||
|
virtual void ThreadCount(unsigned int threads, const char* seedString = NULL) { }
|
||||||
|
virtual void Transparency(bool transparency) { }
|
||||||
|
virtual void InteractiveFilter(eInteractiveFilter filter) { }
|
||||||
|
virtual unsigned int FinalRasW() const { return 0; }
|
||||||
|
virtual unsigned int FinalRasH() const { return 0; }
|
||||||
|
virtual unsigned int SuperRasW() const { return 0; }
|
||||||
|
virtual unsigned int SuperRasH() const { return 0; }
|
||||||
|
virtual unsigned int FinalBufferSize() const { return 0; }
|
||||||
|
virtual unsigned int GutterWidth() const { return 0; }
|
||||||
|
virtual double ScaledQuality() const { return 0; }
|
||||||
|
virtual double LowerLeftX(bool gutter = true) const { return 0; }
|
||||||
|
virtual double LowerLeftY(bool gutter = true) const { return 0; }
|
||||||
|
virtual double UpperRightX(bool gutter = true) const { return 0; }
|
||||||
|
virtual double UpperRightY(bool gutter = true) const { return 0; }
|
||||||
|
virtual unsigned __int64 MemoryRequired(bool includeFinal) { return 0; }
|
||||||
|
virtual unsigned __int64 MemoryAvailable() { return 0; }
|
||||||
|
virtual bool PrepFinalAccumVector(vector<unsigned char>& pixels) { return false; }
|
||||||
|
virtual eProcessState ProcessState() const { return NONE; }
|
||||||
|
virtual eProcessAction ProcessAction() const { return NOTHING; }
|
||||||
|
virtual EmberStats Stats() const { EmberStats stats; return stats; }
|
||||||
|
virtual eRenderStatus Run(vector<unsigned char>& finalImage, double time = 0, unsigned int subBatchCountOverride = 0, bool forceOutput = false, size_t finalOffset = 0) { return RENDER_ERROR; }
|
||||||
|
virtual EmberImageComments ImageComments(unsigned int printEditDepth = 0, bool intPalette = false, bool hexPalette = true) { EmberImageComments comments; return comments; }
|
||||||
|
virtual DensityFilterBase* GetDensityFilter() { return NULL; }
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Renderer is the main class where all of the execution takes place.
|
||||||
|
/// It is intended that the program have one instance of it that it
|
||||||
|
/// keeps around for its duration. After a user sets up an ember, it's passed
|
||||||
|
/// in to be rendered.
|
||||||
|
/// This class derives from EmberReport, so the caller is able
|
||||||
|
/// to retrieve a text dump of error information if any errors occur.
|
||||||
|
/// The final image output vector is also passed in because the calling code has more
|
||||||
|
/// use for it than this class does.
|
||||||
|
/// Several functions are made virtual and have a default CPU-based implementation
|
||||||
|
/// that roughly matches what flam3 did. However they can be overriden in derived classes
|
||||||
|
/// to provide alternative rendering implementations, such as using the GPU.
|
||||||
|
/// Since this is a templated class, it's supposed to be entirely implemented in this .h file.
|
||||||
|
/// However, VC++ 2010 has very crippled support for lambdas, which Renderer makes use of.
|
||||||
|
/// If too many lambdas are used in a .h file, it will crash the compiler when another library
|
||||||
|
/// tries to link to it. To work around the bug, only declarations are here and all implementations
|
||||||
|
/// are in the .cpp file. It's unclear at what point it starts/stops working. But it seems that once
|
||||||
|
/// enough code is placed in the .h file, the compiler crashes. So for the sake of consistency, everything
|
||||||
|
/// is moved to the .cpp, even simple getters. One drawback however, is that the class must be
|
||||||
|
/// explicitly exported at the bottom of the file.
|
||||||
|
/// Also, despite explicitly doing this, the compiler throws a C4661 warning
|
||||||
|
/// for every single function in this class, saying it can't find the implementation. This warning
|
||||||
|
/// can be safely ignored.
|
||||||
|
/// Template argument T expected to be float or double.
|
||||||
|
/// Template argument bucketT was originally used to experiment with different types for the histogram, however
|
||||||
|
/// the only types that work are float and double, so it's useless and should always match what T is.
|
||||||
|
/// Mismatched types between T and bucketT are undefined.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T, typename bucketT>
|
||||||
|
class EMBER_API Renderer : public RendererBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Renderer();
|
||||||
|
virtual ~Renderer();
|
||||||
|
|
||||||
|
virtual void ComputeBounds();
|
||||||
|
void ComputeCamera();
|
||||||
|
void ChangeVal(std::function<void (void)> func, eProcessAction action);
|
||||||
|
virtual void SetEmber(Ember<T>& ember, eProcessAction action = FULL_RENDER);
|
||||||
|
virtual void SetEmber(vector<Ember<T>>& embers);
|
||||||
|
void AddEmber(Ember<T>& ember);
|
||||||
|
bool CreateTemporalFilter(bool& newAlloc);
|
||||||
|
bool AssignIterator();
|
||||||
|
virtual bool PrepFinalAccumVector(vector<unsigned char>& pixels);
|
||||||
|
virtual eRenderStatus Run(vector<unsigned char>& finalImage, double time = 0, unsigned int subBatchCountOverride = 0, bool forceOutput = false, size_t finalOffset = 0);
|
||||||
|
virtual EmberImageComments ImageComments(unsigned int printEditDepth = 0, bool intPalette = false, bool hexPalette = true);
|
||||||
|
virtual unsigned __int64 MemoryRequired(bool includeFinal);
|
||||||
|
|
||||||
|
//Virtual functions to be overriden in derived renderers that use the GPU.
|
||||||
|
virtual unsigned __int64 MemoryAvailable();
|
||||||
|
virtual void Reset();
|
||||||
|
virtual bool Ok() const;
|
||||||
|
virtual bool CreateDEFilter(bool& newAlloc);
|
||||||
|
virtual bool CreateSpatialFilter(bool& newAlloc);
|
||||||
|
virtual unsigned int SubBatchSize() const;
|
||||||
|
virtual void SubBatchSize(unsigned int sbs);
|
||||||
|
virtual unsigned int NumChannels() const;
|
||||||
|
virtual void NumChannels(unsigned int numChannels);
|
||||||
|
virtual eRendererType RendererType() const;
|
||||||
|
virtual unsigned int ThreadCount() const;
|
||||||
|
virtual void ThreadCount(unsigned int threads, const char* seedString = NULL);
|
||||||
|
virtual void Callback(RenderCallback* callback);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
//Virtual functions to be overriden in derived renderers that use the GPU, but not accessed outside.
|
||||||
|
virtual void MakeDmap(T colorScalar);
|
||||||
|
virtual bool Alloc();
|
||||||
|
virtual bool ResetBuckets(bool resetHist = true, bool resetAccum = true);
|
||||||
|
virtual eRenderStatus LogScaleDensityFilter();
|
||||||
|
virtual eRenderStatus GaussianDensityFilter();
|
||||||
|
virtual eRenderStatus AccumulatorToFinalImage(vector<unsigned char>& pixels, size_t finalOffset);
|
||||||
|
virtual eRenderStatus AccumulatorToFinalImage(unsigned char* pixels, size_t finalOffset);
|
||||||
|
virtual EmberStats Iterate(unsigned __int64 iterCount, unsigned int pass, unsigned int temporalSample);
|
||||||
|
|
||||||
|
public:
|
||||||
|
//Accessors for render properties.
|
||||||
|
vector<QTIsaac<ISAAC_SIZE, ISAAC_INT>> RandVec();
|
||||||
|
bool RandVec(vector<QTIsaac<ISAAC_SIZE, ISAAC_INT>>& randVec);
|
||||||
|
|
||||||
|
inline bool LockAccum() const;
|
||||||
|
void LockAccum(bool lockAccum);
|
||||||
|
|
||||||
|
virtual bool EarlyClip() const;
|
||||||
|
virtual void EarlyClip(bool earlyClip);
|
||||||
|
|
||||||
|
inline bool InsertPalette() const;
|
||||||
|
void InsertPalette(bool insertPalette);
|
||||||
|
|
||||||
|
inline bool ReclaimOnResize() const;
|
||||||
|
virtual void ReclaimOnResize(bool reclaimOnResize);
|
||||||
|
|
||||||
|
inline bool Transparency() const;
|
||||||
|
virtual void Transparency(bool transparency);
|
||||||
|
|
||||||
|
inline unsigned int BytesPerChannel() const;
|
||||||
|
void BytesPerChannel(unsigned int bytesPerChannel);
|
||||||
|
|
||||||
|
inline T PixelAspectRatio() const;
|
||||||
|
void PixelAspectRatio(T pixelAspectRatio);
|
||||||
|
|
||||||
|
inline eInteractiveFilter InteractiveFilter() const;
|
||||||
|
virtual void InteractiveFilter(eInteractiveFilter filter);
|
||||||
|
|
||||||
|
//Threading control.
|
||||||
|
virtual void EnterRender();
|
||||||
|
virtual void LeaveRender();
|
||||||
|
virtual void EnterFinalAccum();
|
||||||
|
virtual void LeaveFinalAccum();
|
||||||
|
virtual void EnterResize();
|
||||||
|
virtual void LeaveResize();
|
||||||
|
virtual void Abort();
|
||||||
|
virtual bool Aborted();
|
||||||
|
virtual bool InRender();
|
||||||
|
virtual bool InFinalAccum();
|
||||||
|
|
||||||
|
//Renderer properties, getters only.
|
||||||
|
virtual unsigned int SuperRasW() const;
|
||||||
|
virtual unsigned int SuperRasH() const;
|
||||||
|
inline unsigned int SuperSize() const;
|
||||||
|
virtual unsigned int FinalBufferSize() const;
|
||||||
|
inline unsigned int FinalRowSize() const;
|
||||||
|
inline unsigned int FinalDimensions() const;
|
||||||
|
inline unsigned int PixelSize() const;
|
||||||
|
virtual unsigned int GutterWidth() const;
|
||||||
|
inline unsigned int DensityFilterOffset() const;
|
||||||
|
virtual double ScaledQuality() const;
|
||||||
|
inline T Scale() const;
|
||||||
|
inline T PixelsPerUnitX() const;
|
||||||
|
inline T PixelsPerUnitY() const;
|
||||||
|
virtual double LowerLeftX(bool gutter = true) const;
|
||||||
|
virtual double LowerLeftY(bool gutter = true) const;
|
||||||
|
virtual double UpperRightX(bool gutter = true) const;
|
||||||
|
virtual double UpperRightY(bool gutter = true) const;
|
||||||
|
inline T K1() const;
|
||||||
|
inline T K2() const;
|
||||||
|
inline unsigned __int64 TotalIterCount() const;
|
||||||
|
inline unsigned __int64 ItersPerTemporalSample() const;
|
||||||
|
virtual eProcessState ProcessState() const;
|
||||||
|
virtual eProcessAction ProcessAction() const;
|
||||||
|
virtual EmberStats Stats() const;
|
||||||
|
inline const CarToRas<T>* CoordMap() const;
|
||||||
|
inline glm::detail::tvec4<bucketT, glm::defaultp>* HistBuckets();
|
||||||
|
inline glm::detail::tvec4<bucketT, glm::defaultp>* AccumulatorBuckets();
|
||||||
|
inline SpatialFilter<T>* GetSpatialFilter();
|
||||||
|
inline TemporalFilter<T>* GetTemporalFilter();
|
||||||
|
virtual DensityFilter<T>* GetDensityFilter();
|
||||||
|
|
||||||
|
//Ember wrappers, getters only.
|
||||||
|
inline bool XaosPresent();
|
||||||
|
virtual inline unsigned int FinalRasW() const;
|
||||||
|
virtual inline unsigned int FinalRasH() const;
|
||||||
|
inline unsigned int Supersample() const;
|
||||||
|
inline unsigned int Passes() const;
|
||||||
|
inline unsigned int TemporalSamples() const;
|
||||||
|
inline unsigned int PaletteIndex() const;
|
||||||
|
inline T Time() const;
|
||||||
|
inline T Quality() const;
|
||||||
|
inline T SpatialFilterRadius() const;
|
||||||
|
inline T PixelsPerUnit() const;
|
||||||
|
inline T Zoom() const;
|
||||||
|
inline T CenterX() const;
|
||||||
|
inline T CenterY() const;
|
||||||
|
inline T Rotate() const;
|
||||||
|
inline T Hue() const;
|
||||||
|
inline T Brightness() const;
|
||||||
|
inline T Contrast() const;
|
||||||
|
inline T Gamma() const;
|
||||||
|
inline T Vibrancy() const;
|
||||||
|
inline T GammaThresh() const;
|
||||||
|
inline T HighlightPower() const;
|
||||||
|
inline Color<T> Background() const;
|
||||||
|
inline const Xform<T>* Xforms() const;
|
||||||
|
inline Xform<T>* NonConstXforms();
|
||||||
|
inline unsigned int XformCount() const;
|
||||||
|
inline const Xform<T>* FinalXform() const;
|
||||||
|
inline Xform<T>* NonConstFinalXform();
|
||||||
|
inline bool UseFinalXform() const;
|
||||||
|
inline const Palette<T>* GetPalette() const;
|
||||||
|
inline ePaletteMode PaletteMode() const;
|
||||||
|
|
||||||
|
//Iterator wrappers.
|
||||||
|
const unsigned char* XformDistributions() const;
|
||||||
|
const unsigned int XformDistributionsSize() const;
|
||||||
|
Point<T>* Samples(unsigned int threadIndex) const;
|
||||||
|
|
||||||
|
void* m_ProgressParameter;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
//Non-virtual functions that might be needed by a derived class.
|
||||||
|
void PrepFinalAccumVals(Color<T>& background, T& g, T& linRange, T& vibrancy);
|
||||||
|
|
||||||
|
private:
|
||||||
|
//Miscellaneous functions used only in this class.
|
||||||
|
void Accumulate(Point<T>* samples, unsigned int sampleCount, const Palette<bucketT>* palette);
|
||||||
|
inline void AddToAccum(const glm::detail::tvec4<bucketT, glm::defaultp>& bucket, int i, int ii, int j, int jj);
|
||||||
|
template <typename accumT> void GammaCorrection(glm::detail::tvec4<bucketT, glm::defaultp>& bucket, Color<T>& background, T g, T linRange, T vibrancy, bool doAlpha, bool scale, accumT* correctedChannels);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool m_EarlyClip;
|
||||||
|
bool m_Transparency;
|
||||||
|
unsigned int m_SuperRasW;
|
||||||
|
unsigned int m_SuperRasH;
|
||||||
|
unsigned int m_SuperSize;
|
||||||
|
unsigned int m_GutterWidth;
|
||||||
|
unsigned int m_DensityFilterOffset;
|
||||||
|
unsigned int m_NumChannels;
|
||||||
|
unsigned int m_BytesPerChannel;
|
||||||
|
unsigned int m_SubBatchSize;
|
||||||
|
unsigned int m_ThreadsToUse;
|
||||||
|
T m_ScaledQuality;
|
||||||
|
T m_Scale;
|
||||||
|
T m_PixelsPerUnitX;
|
||||||
|
T m_PixelsPerUnitY;
|
||||||
|
T m_PixelAspectRatio;
|
||||||
|
T m_LowerLeftX;
|
||||||
|
T m_LowerLeftY;
|
||||||
|
T m_UpperRightX;
|
||||||
|
T m_UpperRightY;
|
||||||
|
T m_K1;
|
||||||
|
T m_K2;
|
||||||
|
T m_Vibrancy;//Accumulate these after each temporal sample.
|
||||||
|
T m_Gamma;
|
||||||
|
Color<T> m_Background;
|
||||||
|
Affine2D<T> m_RotMat;
|
||||||
|
|
||||||
|
volatile bool m_Abort;
|
||||||
|
bool m_LockAccum;
|
||||||
|
bool m_InRender;
|
||||||
|
bool m_InFinalAccum;
|
||||||
|
bool m_InsertPalette;
|
||||||
|
bool m_ReclaimOnResize;
|
||||||
|
unsigned int m_VibGamCount;
|
||||||
|
unsigned int m_LastPass;
|
||||||
|
unsigned int m_LastTemporalSample;
|
||||||
|
unsigned __int64 m_LastIter;
|
||||||
|
double m_LastIterPercent;
|
||||||
|
eProcessAction m_ProcessAction;
|
||||||
|
eProcessState m_ProcessState;
|
||||||
|
eInteractiveFilter m_InteractiveFilter;
|
||||||
|
EmberStats m_Stats;
|
||||||
|
Ember<T> m_Ember;
|
||||||
|
Ember<T> m_TempEmber;
|
||||||
|
Ember<T> m_LastEmber;
|
||||||
|
vector<Ember<T>> m_Embers;
|
||||||
|
CarToRas<T> m_CarToRas;
|
||||||
|
RenderCallback* m_Callback;
|
||||||
|
Iterator<T>* m_Iterator;
|
||||||
|
auto_ptr<StandardIterator<T>> m_StandardIterator;
|
||||||
|
auto_ptr<XaosIterator<T>> m_XaosIterator;
|
||||||
|
Palette<bucketT> m_Dmap;
|
||||||
|
vector<glm::detail::tvec4<bucketT, glm::defaultp>> m_HistBuckets;
|
||||||
|
vector<glm::detail::tvec4<bucketT, glm::defaultp>> m_AccumulatorBuckets;
|
||||||
|
auto_ptr<SpatialFilter<T>> m_SpatialFilter;
|
||||||
|
auto_ptr<TemporalFilter<T>> m_TemporalFilter;
|
||||||
|
auto_ptr<DensityFilter<T>> m_DensityFilter;
|
||||||
|
vector<vector<Point<T>>> m_Samples;
|
||||||
|
vector<unsigned __int64> m_SubBatch;
|
||||||
|
vector<unsigned __int64> m_BadVals;
|
||||||
|
vector<QTIsaac<ISAAC_SIZE, ISAAC_INT>> m_Rand;
|
||||||
|
tbb::task_group m_TaskGroup;
|
||||||
|
CriticalSection m_RenderingCs, m_AccumCs, m_FinalAccumCs, m_ResizeCs;
|
||||||
|
Timing m_RenderTimer, m_ProgressTimer;
|
||||||
|
EmberToXml<T> m_EmberToXml;
|
||||||
|
};
|
||||||
|
|
||||||
|
//This class had to be implemented in a cpp file because the compiler was breaking.
|
||||||
|
//So the explicit instantiation must be declared here rather than in Ember.cpp where
|
||||||
|
//all of the other classes are done.
|
||||||
|
template EMBER_API class Renderer<float, float>;
|
||||||
|
|
||||||
|
#ifdef DO_DOUBLE
|
||||||
|
template EMBER_API class Renderer<double, double>;
|
||||||
|
#endif
|
||||||
|
}
|
1394
Source/Ember/SheepTools.h
Normal file
1394
Source/Ember/SheepTools.h
Normal file
File diff suppressed because it is too large
Load Diff
909
Source/Ember/SpatialFilter.h
Normal file
909
Source/Ember/SpatialFilter.h
Normal file
@ -0,0 +1,909 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "EmberDefines.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SpatialFilter base, derived and factory classes.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberNs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The types of spatial filters available.
|
||||||
|
/// </summary>
|
||||||
|
enum eSpatialFilterType
|
||||||
|
{
|
||||||
|
GAUSSIAN_SPATIAL_FILTER = 0,
|
||||||
|
HERMITE_SPATIAL_FILTER = 1,
|
||||||
|
BOX_SPATIAL_FILTER = 2,
|
||||||
|
TRIANGLE_SPATIAL_FILTER = 3,
|
||||||
|
BELL_SPATIAL_FILTER = 4,
|
||||||
|
BSPLINE_SPATIAL_FILTER = 5,
|
||||||
|
LANCZOS3_SPATIAL_FILTER = 6,
|
||||||
|
LANCZOS2_SPATIAL_FILTER = 7,
|
||||||
|
MITCHELL_SPATIAL_FILTER = 8,
|
||||||
|
BLACKMAN_SPATIAL_FILTER = 9,
|
||||||
|
CATROM_SPATIAL_FILTER = 10,
|
||||||
|
HAMMING_SPATIAL_FILTER = 11,
|
||||||
|
HANNING_SPATIAL_FILTER = 12,
|
||||||
|
QUADRATIC_SPATIAL_FILTER = 13
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Spatial filtering is done in the final accumulation stage to add some additional
|
||||||
|
/// bluring to smooth out noisy areas.
|
||||||
|
/// The bulk of the work is done in this base class Create() function.
|
||||||
|
/// Because it calls the virtual Filter() function, it cannot be automatically called in the constructor.
|
||||||
|
/// So the caller must manually call it after constructing the filter object.
|
||||||
|
/// Each derived class will implement an override of Filter() which
|
||||||
|
/// contains the specific filter calculation for the algorithm whose name the class matches.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API SpatialFilter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Assign basic parameters for creating a spatial filter. The caller must still call Create().
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterType">Type of filter to create</param>
|
||||||
|
/// <param name="support">Miscellaneous value</param>
|
||||||
|
/// <param name="filterRadius">The filter radius</param>
|
||||||
|
/// <param name="superSample">The supersample of the ember being rendered</param>
|
||||||
|
/// <param name="pixelAspectRatio">The pixel aspect ratio being used to render. Default: 1.</param>
|
||||||
|
SpatialFilter(eSpatialFilterType filterType, T support, T filterRadius, unsigned int superSample, T pixelAspectRatio = T(1.0))
|
||||||
|
{
|
||||||
|
m_FilterType = filterType;
|
||||||
|
m_Support = support;
|
||||||
|
m_FilterRadius = filterRadius;
|
||||||
|
m_Supersample = superSample;
|
||||||
|
m_PixelAspectRatio = pixelAspectRatio;
|
||||||
|
//Sadly, cannot call create here because it calls the Filter() virtual function and unlike C#, the vtables
|
||||||
|
//are not yet set up in C++ constructors. The code that instantiates this object must explicitly call Create().
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copy constructor.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filter">The SpatialFilter object to copy</param>
|
||||||
|
SpatialFilter(const SpatialFilter<T>& filter)
|
||||||
|
{
|
||||||
|
*this = filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Virtual destructor so derived class destructors get called.
|
||||||
|
/// </summary>
|
||||||
|
virtual ~SpatialFilter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Assignment operator.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filter">The SpatialFilter object to copy.</param>
|
||||||
|
/// <returns>Reference to updated self</returns>
|
||||||
|
SpatialFilter<T>& operator = (const SpatialFilter<T>& filter)
|
||||||
|
{
|
||||||
|
if (this != &filter)
|
||||||
|
{
|
||||||
|
m_FinalFilterWidth = filter.m_FinalFilterWidth;
|
||||||
|
m_Supersample = filter.m_Supersample;
|
||||||
|
m_Support = filter.m_Support;
|
||||||
|
m_FilterRadius = filter.m_FilterRadius;
|
||||||
|
m_PixelAspectRatio = filter.m_PixelAspectRatio;
|
||||||
|
m_FilterType = filter.m_FilterType;
|
||||||
|
m_Filter = filter.m_Filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Allocates and populates the filter buffer with virtual calls to derived Filter() functions.
|
||||||
|
/// The caller must manually call this after construction.
|
||||||
|
/// </summary>
|
||||||
|
void Create()
|
||||||
|
{
|
||||||
|
T fw = T(2.0) * m_Support * m_Supersample * m_FilterRadius / m_PixelAspectRatio;
|
||||||
|
T adjust, ii, jj;
|
||||||
|
|
||||||
|
int fwidth = ((int)fw) + 1;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
//Make sure the filter kernel has same parity as oversample.
|
||||||
|
if ((fwidth ^ m_Supersample) & 1)
|
||||||
|
fwidth++;
|
||||||
|
|
||||||
|
//Calculate the coordinate scaling factor for the kernel values.
|
||||||
|
if (fw > 0.0)
|
||||||
|
adjust = m_Support * fwidth / fw;
|
||||||
|
else
|
||||||
|
adjust = T(1.0);
|
||||||
|
|
||||||
|
m_Filter.resize(fwidth * fwidth);
|
||||||
|
|
||||||
|
//Fill in the coefs.
|
||||||
|
for (i = 0; i < fwidth; i++)
|
||||||
|
{
|
||||||
|
for (j = 0; j < fwidth; j++)
|
||||||
|
{
|
||||||
|
//Calculate the function inputs for the kernel function.
|
||||||
|
ii = ((T(2.0) * i + T(1.0)) / T(fwidth) - T(1.0)) * adjust;
|
||||||
|
jj = ((T(2.0) * j + T(1.0)) / T(fwidth) - T(1.0)) * adjust;
|
||||||
|
|
||||||
|
//Adjust for aspect ratio.
|
||||||
|
jj /= m_PixelAspectRatio;
|
||||||
|
|
||||||
|
m_Filter[i + j * fwidth] = Filter(ii) * Filter(jj);//Call virtual Filter(), implemented in specific derived filter classes.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Normalize, and return a bad value if the values were too small.
|
||||||
|
if (!Normalize())
|
||||||
|
m_FinalFilterWidth = -1;
|
||||||
|
else
|
||||||
|
m_FinalFilterWidth = fwidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return a string representation of this filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The string representation of this filter</returns>
|
||||||
|
string ToString() const
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
stringstream ss;
|
||||||
|
|
||||||
|
ss
|
||||||
|
<< "Spatial Filter:" << endl
|
||||||
|
<< " Support: " << m_Support << endl
|
||||||
|
<< " Filter radius: " << m_FilterRadius << endl
|
||||||
|
<< " Supersample: " << m_Supersample << endl
|
||||||
|
<< "Pixel aspect ratio: " << m_PixelAspectRatio << endl
|
||||||
|
<< "Final filter width: " << m_FinalFilterWidth << endl
|
||||||
|
<< "Filter buffer size: " << m_Filter.size() << endl;
|
||||||
|
|
||||||
|
ss << "Filter: " << endl;
|
||||||
|
|
||||||
|
for (i = 0; i < m_Filter.size(); i++)
|
||||||
|
{
|
||||||
|
ss << "Filter[" << i << "]: " << m_Filter[i] << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Accessors.
|
||||||
|
/// </summary>
|
||||||
|
void Apply() { }
|
||||||
|
inline int FinalFilterWidth() const { return m_FinalFilterWidth; }
|
||||||
|
inline unsigned int Supersample() const { return m_Supersample; }
|
||||||
|
inline unsigned int BufferSize() const { return (unsigned int)m_Filter.size(); }
|
||||||
|
inline unsigned int BufferSizeBytes() const { return BufferSize() * sizeof(T); }
|
||||||
|
inline T Support() const { return m_Support; }
|
||||||
|
inline T FilterRadius() const { return m_FilterRadius; }
|
||||||
|
inline T PixelAspectRatio() const { return m_PixelAspectRatio; }
|
||||||
|
inline eSpatialFilterType FilterType() const { return m_FilterType; }
|
||||||
|
inline T* Filter() { return m_Filter.data(); }
|
||||||
|
inline const T& operator[] (size_t index) const { return m_Filter[index]; }
|
||||||
|
virtual T Filter(T t) const = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// <summary>
|
||||||
|
/// Calculation function used in Lanczos filters.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">The x</param>
|
||||||
|
/// <returns>The calculated value</returns>
|
||||||
|
static T Sinc(T x)
|
||||||
|
{
|
||||||
|
x *= T(M_PI);
|
||||||
|
|
||||||
|
if (x != 0)
|
||||||
|
return sin(x) / x;
|
||||||
|
|
||||||
|
return 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// <summary>
|
||||||
|
/// Normalize all filter values.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>True if any value was non-zero, else false if all were zero.</returns>
|
||||||
|
bool Normalize()
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
T t = T(0.0);
|
||||||
|
|
||||||
|
for (i = 0; i < m_Filter.size(); i++)
|
||||||
|
t += m_Filter[i];
|
||||||
|
|
||||||
|
if (t == 0.0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
t = T(1.0) / t;
|
||||||
|
|
||||||
|
for (i = 0; i < m_Filter.size(); i++)
|
||||||
|
m_Filter[i] *= t;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int m_FinalFilterWidth;//The final width that the filter ends up being.
|
||||||
|
unsigned int m_Supersample;//The supersample value of the ember using this filter to render.
|
||||||
|
T m_Support;//Extra value.
|
||||||
|
T m_FilterRadius;//The requested filter radius.
|
||||||
|
T m_PixelAspectRatio;//The aspect ratio of the ember using this filter to render, usually 1.
|
||||||
|
eSpatialFilterType m_FilterType;//The type of filter this is.
|
||||||
|
vector<T> m_Filter;//The vector holding the calculated filter values.
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derivation for Gaussian filter.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API GaussianFilter : public SpatialFilter<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which does nothing but pass values to the base class. The caller must still call Create().
|
||||||
|
/// Support = 1.5.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterRadius">The filter radius</param>
|
||||||
|
/// <param name="superSample">The supersample of the ember being rendered</param>
|
||||||
|
/// <param name="pixelAspectRatio">The pixel aspect ratio being used to render. Default: 1.</param>
|
||||||
|
GaussianFilter(T filterRadius, unsigned int superSample, T pixelAspectRatio = T(1.0))
|
||||||
|
: SpatialFilter<T>(GAUSSIAN_SPATIAL_FILTER, T(1.5), filterRadius, superSample, pixelAspectRatio) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Apply Gaussian filter to t parameter and return.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="t">The value to apply the filter to</param>
|
||||||
|
/// <returns>The filtered value</returns>
|
||||||
|
virtual T Filter(T t) const
|
||||||
|
{
|
||||||
|
return exp(-2 * t * t) * sqrt(2 / T(M_PI));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derivation for Hermite filter.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API HermiteFilter : public SpatialFilter<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which does nothing but pass values to the base class. The caller must still call Create().
|
||||||
|
/// Support = 1.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterRadius">The filter radius</param>
|
||||||
|
/// <param name="superSample">The supersample of the ember being rendered</param>
|
||||||
|
/// <param name="pixelAspectRatio">The pixel aspect ratio being used to render. Default: 1.</param>
|
||||||
|
HermiteFilter(T filterRadius, unsigned int superSample, T pixelAspectRatio = T(1.0))
|
||||||
|
: SpatialFilter<T>(HERMITE_SPATIAL_FILTER, T(1.0), filterRadius, superSample, pixelAspectRatio) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Apply Hermite filter to t parameter and return.
|
||||||
|
/// f(t) = 2|t|^3 - 3|t|^2 + 1, -1 <= t <= 1.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="t">The value to apply the filter to</param>
|
||||||
|
/// <returns>The filtered value</returns>
|
||||||
|
virtual T Filter(T t) const
|
||||||
|
{
|
||||||
|
if (t < 0)
|
||||||
|
t = -t;
|
||||||
|
|
||||||
|
if (t < 1)
|
||||||
|
return ((T(2.0) * t - T(3.0)) * t * t + T(1.0));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derivation for Box filter.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API BoxFilter : public SpatialFilter<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which does nothing but pass values to the base class. The caller must still call Create().
|
||||||
|
/// Support = 0.5.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterRadius">The filter radius</param>
|
||||||
|
/// <param name="superSample">The supersample of the ember being rendered</param>
|
||||||
|
/// <param name="pixelAspectRatio">The pixel aspect ratio being used to render. Default: 1.</param>
|
||||||
|
BoxFilter(T filterRadius, unsigned int superSample, T pixelAspectRatio = T(1.0))
|
||||||
|
: SpatialFilter<T>(BOX_SPATIAL_FILTER, T(0.5), filterRadius, superSample, pixelAspectRatio) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Apply Box filter to t parameter and return.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="t">The value to apply the filter to</param>
|
||||||
|
/// <returns>The filtered value</returns>
|
||||||
|
virtual T Filter(T t) const
|
||||||
|
{
|
||||||
|
if ((t > T(-0.5)) && (t <= T(0.5)))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derivation for Triangle filter.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API TriangleFilter : public SpatialFilter<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which does nothing but pass values to the base class. The caller must still call Create().
|
||||||
|
/// Support = 1.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterRadius">The filter radius</param>
|
||||||
|
/// <param name="superSample">The supersample of the ember being rendered</param>
|
||||||
|
/// <param name="pixelAspectRatio">The pixel aspect ratio being used to render. Default: 1.</param>
|
||||||
|
TriangleFilter(T filterRadius, unsigned int superSample, T pixelAspectRatio = T(1.0))
|
||||||
|
: SpatialFilter<T>(TRIANGLE_SPATIAL_FILTER, T(1.0), filterRadius, superSample, pixelAspectRatio) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Apply Triangle filter to t parameter and return.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="t">The value to apply the filter to</param>
|
||||||
|
/// <returns>The filtered value</returns>
|
||||||
|
virtual T Filter(T t) const
|
||||||
|
{
|
||||||
|
if (t < 0)
|
||||||
|
t = -t;
|
||||||
|
|
||||||
|
if (t < 1)
|
||||||
|
return 1 - t;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derivation for Bell filter.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API BellFilter : public SpatialFilter<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which does nothing but pass values to the base class. The caller must still call Create().
|
||||||
|
/// Support = 1.5.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterRadius">The filter radius</param>
|
||||||
|
/// <param name="superSample">The supersample of the ember being rendered</param>
|
||||||
|
/// <param name="pixelAspectRatio">The pixel aspect ratio being used to render. Default: 1.</param>
|
||||||
|
BellFilter(T filterRadius, unsigned int superSample, T pixelAspectRatio = T(1.0))
|
||||||
|
: SpatialFilter<T>(BELL_SPATIAL_FILTER, T(1.5), filterRadius, superSample, pixelAspectRatio) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Apply Bell filter to t parameter and return.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="t">The value to apply the filter to</param>
|
||||||
|
/// <returns>The filtered value</returns>
|
||||||
|
virtual T Filter(T t) const
|
||||||
|
{
|
||||||
|
//box (*) box (*) box.
|
||||||
|
if (t < 0)
|
||||||
|
t = -t;
|
||||||
|
|
||||||
|
if (t < T(0.5))
|
||||||
|
return (T(0.75) - (t * t));
|
||||||
|
|
||||||
|
if (t < T(1.5))
|
||||||
|
{
|
||||||
|
t = (t - T(1.5));
|
||||||
|
return (T(0.5) * (t * t));
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derivation for B Spline filter.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API BsplineFilter : public SpatialFilter<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which does nothing but pass values to the base class. The caller must still call Create().
|
||||||
|
/// Support = 2.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterRadius">The filter radius</param>
|
||||||
|
/// <param name="superSample">The supersample of the ember being rendered</param>
|
||||||
|
/// <param name="pixelAspectRatio">The pixel aspect ratio being used to render. Default: 1.</param>
|
||||||
|
BsplineFilter(T filterRadius, unsigned int superSample, T pixelAspectRatio = T(1.0))
|
||||||
|
: SpatialFilter<T>(BSPLINE_SPATIAL_FILTER, T(2.0), filterRadius, superSample, pixelAspectRatio) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Apply B Spline filter to t parameter and return.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="t">The value to apply the filter to</param>
|
||||||
|
/// <returns>The filtered value</returns>
|
||||||
|
virtual T Filter(T t) const
|
||||||
|
{
|
||||||
|
//box (*) box (*) box (*) box.
|
||||||
|
T tt;
|
||||||
|
|
||||||
|
if (t < 0)
|
||||||
|
t = -t;
|
||||||
|
|
||||||
|
if (t < 1)
|
||||||
|
{
|
||||||
|
tt = t * t;
|
||||||
|
return ((T(0.5) * tt * t) - tt + (T(2.0) / T(3.0)));
|
||||||
|
}
|
||||||
|
else if (t < 2)
|
||||||
|
{
|
||||||
|
t = 2 - t;
|
||||||
|
return ((T(1.0) / T(6.0)) * (t * t * t));
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derivation for Lanczos 3 filter.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API Lanczos3Filter : public SpatialFilter<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which does nothing but pass values to the base class. The caller must still call Create().
|
||||||
|
/// Support = 3.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterRadius">The filter radius</param>
|
||||||
|
/// <param name="superSample">The supersample of the ember being rendered</param>
|
||||||
|
/// <param name="pixelAspectRatio">The pixel aspect ratio being used to render. Default: 1.</param>
|
||||||
|
Lanczos3Filter(T filterRadius, unsigned int superSample, T pixelAspectRatio = T(1.0))
|
||||||
|
: SpatialFilter<T>(LANCZOS3_SPATIAL_FILTER, T(3.0), filterRadius, superSample, pixelAspectRatio) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Apply Lanczos 3 filter to t parameter and return.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="t">The value to apply the filter to</param>
|
||||||
|
/// <returns>The filtered value</returns>
|
||||||
|
virtual T Filter(T t) const
|
||||||
|
{
|
||||||
|
if (t < 0)
|
||||||
|
t = -t;
|
||||||
|
|
||||||
|
if (t < 3)
|
||||||
|
return Sinc(t) * Sinc(t / 3);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derivation for Lanczos 2 filter.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API Lanczos2Filter : public SpatialFilter<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which does nothing but pass values to the base class. The caller must still call Create().
|
||||||
|
/// Support = 2.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterRadius">The filter radius</param>
|
||||||
|
/// <param name="superSample">The supersample of the ember being rendered</param>
|
||||||
|
/// <param name="pixelAspectRatio">The pixel aspect ratio being used to render. Default: 1.</param>
|
||||||
|
Lanczos2Filter(T filterRadius, unsigned int superSample, T pixelAspectRatio = T(1.0))
|
||||||
|
: SpatialFilter<T>(LANCZOS2_SPATIAL_FILTER, T(2.0), filterRadius, superSample, pixelAspectRatio) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Apply Lanczos 2 filter to t parameter and return.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="t">The value to apply the filter to</param>
|
||||||
|
/// <returns>The filtered value</returns>
|
||||||
|
virtual T Filter(T t) const
|
||||||
|
{
|
||||||
|
if (t < 0)
|
||||||
|
t = -t;
|
||||||
|
|
||||||
|
if (t < 2)
|
||||||
|
return Sinc(t) * Sinc(t / 2);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derivation for Mitchell filter.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API MitchellFilter : public SpatialFilter<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which does nothing but pass values to the base class. The caller must still call Create().
|
||||||
|
/// Support = 2.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterRadius">The filter radius</param>
|
||||||
|
/// <param name="superSample">The supersample of the ember being rendered</param>
|
||||||
|
/// <param name="pixelAspectRatio">The pixel aspect ratio being used to render. Default: 1.</param>
|
||||||
|
MitchellFilter(T filterRadius, unsigned int superSample, T pixelAspectRatio = T(1.0))
|
||||||
|
: SpatialFilter<T>(MITCHELL_SPATIAL_FILTER, T(2.0), filterRadius, superSample, pixelAspectRatio) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Apply Mitchell filter to t parameter and return.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="t">The value to apply the filter to</param>
|
||||||
|
/// <returns>The filtered value</returns>
|
||||||
|
virtual T Filter(T t) const
|
||||||
|
{
|
||||||
|
T tt = t * t;
|
||||||
|
const T b = T(1) / T(3);
|
||||||
|
const T c = T(1) / T(3);
|
||||||
|
|
||||||
|
if (t < 0)
|
||||||
|
t = -t;
|
||||||
|
|
||||||
|
if (t < 1)
|
||||||
|
{
|
||||||
|
t = (((T(12.0) - T(9.0) * b - T(6.0) * c) * (t * tt))
|
||||||
|
+ ((T(-18.0) + T(12.0) * b + T(6.0) * c) * tt)
|
||||||
|
+ (T(6.0) - 2 * b));
|
||||||
|
|
||||||
|
return t / 6;
|
||||||
|
}
|
||||||
|
else if (t < 2)
|
||||||
|
{
|
||||||
|
t = (((T(-1.0) * b - T(6.0) * c) * (t * tt))
|
||||||
|
+ ((T(6.0) * b + T(30.0) * c) * tt)
|
||||||
|
+ ((T(-12.0) * b - T(48.0) * c) * t)
|
||||||
|
+ (T(8.0) * b + 24 * c));
|
||||||
|
|
||||||
|
return t / 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derivation for Blackman filter.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API BlackmanFilter : public SpatialFilter<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which does nothing but pass values to the base class. The caller must still call Create().
|
||||||
|
/// Support = 1.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterRadius">The filter radius</param>
|
||||||
|
/// <param name="superSample">The supersample of the ember being rendered</param>
|
||||||
|
/// <param name="pixelAspectRatio">The pixel aspect ratio being used to render. Default: 1.</param>
|
||||||
|
BlackmanFilter(T filterRadius, unsigned int superSample, T pixelAspectRatio = T(1.0))
|
||||||
|
: SpatialFilter<T>(BLACKMAN_SPATIAL_FILTER, T(1.0), filterRadius, superSample, pixelAspectRatio) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Apply Blackman filter to t parameter and return.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="t">The value to apply the filter to</param>
|
||||||
|
/// <returns>The filtered value</returns>
|
||||||
|
virtual T Filter(T t) const
|
||||||
|
{
|
||||||
|
return (T(0.42) + T(0.5) * cos(T(M_PI) * t) + T(0.08) * cos(2 * T(M_PI) * t));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derivation for Catmull-Rom filter.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API CatromFilter : public SpatialFilter<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which does nothing but pass values to the base class. The caller must still call Create().
|
||||||
|
/// Support = 2.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterRadius">The filter radius</param>
|
||||||
|
/// <param name="superSample">The supersample of the ember being rendered</param>
|
||||||
|
/// <param name="pixelAspectRatio">The pixel aspect ratio being used to render. Default: 1.</param>
|
||||||
|
CatromFilter(T filterRadius, unsigned int superSample, T pixelAspectRatio = T(1.0))
|
||||||
|
: SpatialFilter<T>(CATROM_SPATIAL_FILTER, T(2.0), filterRadius, superSample, pixelAspectRatio) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Apply Catmull-Rom filter to t parameter and return.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="t">The value to apply the filter to</param>
|
||||||
|
/// <returns>The filtered value</returns>
|
||||||
|
virtual T Filter(T t) const
|
||||||
|
{
|
||||||
|
if (t < 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (t < -1)
|
||||||
|
return T(0.5) * (4 + t * (8 + t * (5 + t)));
|
||||||
|
|
||||||
|
if (t < 0)
|
||||||
|
return T(0.5) * (2 + t * t * (-5 - 3 * t));
|
||||||
|
|
||||||
|
if (t < 1)
|
||||||
|
return T(0.5) * (2 + t * t * (-5 + 3 * t));
|
||||||
|
|
||||||
|
if (t < 2)
|
||||||
|
return T(0.5) * (4 + t * (-8 + t * (5 - t)));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derivation for Hamming filter.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API HammingFilter : public SpatialFilter<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which does nothing but pass values to the base class. The caller must still call Create().
|
||||||
|
/// Support = 1.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterRadius">The filter radius</param>
|
||||||
|
/// <param name="superSample">The supersample of the ember being rendered</param>
|
||||||
|
/// <param name="pixelAspectRatio">The pixel aspect ratio being used to render. Default: 1.</param>
|
||||||
|
HammingFilter(T filterRadius, unsigned int superSample, T pixelAspectRatio = T(1.0))
|
||||||
|
: SpatialFilter<T>(HAMMING_SPATIAL_FILTER, T(1.0), filterRadius, superSample, pixelAspectRatio) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Apply Hamming filter to t parameter and return.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="t">The value to apply the filter to</param>
|
||||||
|
/// <returns>The filtered value</returns>
|
||||||
|
virtual T Filter(T t) const
|
||||||
|
{
|
||||||
|
return T(0.54) + T(0.46) * cos(T(M_PI) * t);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derivation for Hanning filter.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API HanningFilter : public SpatialFilter<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which does nothing but pass values to the base class. The caller must still call Create().
|
||||||
|
/// Support = 1.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterRadius">The filter radius</param>
|
||||||
|
/// <param name="superSample">The supersample of the ember being rendered</param>
|
||||||
|
/// <param name="pixelAspectRatio">The pixel aspect ratio being used to render. Default: 1.</param>
|
||||||
|
HanningFilter(T filterRadius, unsigned int superSample, T pixelAspectRatio = T(1.0))
|
||||||
|
: SpatialFilter<T>(HANNING_SPATIAL_FILTER, T(1.0), filterRadius, superSample, pixelAspectRatio) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Apply Hanning filter to t parameter and return.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="t">The value to apply the filter to</param>
|
||||||
|
/// <returns>The filtered value</returns>
|
||||||
|
virtual T Filter(T t) const
|
||||||
|
{
|
||||||
|
return T(0.5) + T(0.5) * cos(T(M_PI) * t);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derivation for Quadratic filter.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API QuadraticFilter : public SpatialFilter<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which does nothing but pass values to the base class. The caller must still call Create().
|
||||||
|
/// Support = 1.5.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterRadius">The filter radius</param>
|
||||||
|
/// <param name="superSample">The supersample of the ember being rendered</param>
|
||||||
|
/// <param name="pixelAspectRatio">The pixel aspect ratio being used to render. Default: 1.</param>
|
||||||
|
QuadraticFilter(T filterRadius, unsigned int superSample, T pixelAspectRatio = T(1.0))
|
||||||
|
: SpatialFilter<T>(QUADRATIC_SPATIAL_FILTER, T(1.5), filterRadius, superSample, pixelAspectRatio) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Apply Quadratic filter to t parameter and return.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="t">The value to apply the filter to</param>
|
||||||
|
/// <returns>The filtered value</returns>
|
||||||
|
virtual T Filter(T t) const
|
||||||
|
{
|
||||||
|
if (t < -1.5)
|
||||||
|
return 0.0;
|
||||||
|
|
||||||
|
if (t < -0.5)
|
||||||
|
return T(0.5) * (t + T(1.5)) * (t + T(1.5));
|
||||||
|
|
||||||
|
if (t < 0.5)
|
||||||
|
return T(0.75) - (t * t);
|
||||||
|
|
||||||
|
if (t < 1.5)
|
||||||
|
return T(0.5) * (t - T(1.5)) * (t - T(1.5));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convenience class to assist in converting between filter names and the filter objects themselves.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API SpatialFilterCreator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Creates the specified filter type based on the filterType enum parameter.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterType">Type of the filter</param>
|
||||||
|
/// <param name="filterRadius">The filter radius</param>
|
||||||
|
/// <param name="superSample">The supersample value of the ember using this filter to render</param>
|
||||||
|
/// <param name="pixelAspectRatio">The aspect ratio of the ember using this filter to render. Default: 1.</param>
|
||||||
|
/// <returns>A pointer to the newly created filter object</returns>
|
||||||
|
static SpatialFilter<T>* Create(eSpatialFilterType filterType, T filterRadius, unsigned int superSample, T pixelAspectRatio = 1)
|
||||||
|
{
|
||||||
|
SpatialFilter<T>* filter = NULL;
|
||||||
|
|
||||||
|
if (filterType == GAUSSIAN_SPATIAL_FILTER)
|
||||||
|
filter = new GaussianFilter<T>(filterRadius, superSample, pixelAspectRatio);
|
||||||
|
else if (filterType == HERMITE_SPATIAL_FILTER)
|
||||||
|
filter = new HermiteFilter<T>(filterRadius, superSample, pixelAspectRatio);
|
||||||
|
else if (filterType == BOX_SPATIAL_FILTER)
|
||||||
|
filter = new BoxFilter<T>(filterRadius, superSample, pixelAspectRatio);
|
||||||
|
else if (filterType == TRIANGLE_SPATIAL_FILTER)
|
||||||
|
filter = new TriangleFilter<T>(filterRadius, superSample, pixelAspectRatio);
|
||||||
|
else if (filterType == BELL_SPATIAL_FILTER)
|
||||||
|
filter = new BellFilter<T>(filterRadius, superSample, pixelAspectRatio);
|
||||||
|
else if (filterType == BSPLINE_SPATIAL_FILTER)
|
||||||
|
filter = new BsplineFilter<T>(filterRadius, superSample, pixelAspectRatio);
|
||||||
|
else if (filterType == LANCZOS3_SPATIAL_FILTER)
|
||||||
|
filter = new Lanczos3Filter<T>(filterRadius, superSample, pixelAspectRatio);
|
||||||
|
else if (filterType == LANCZOS2_SPATIAL_FILTER)
|
||||||
|
filter = new Lanczos2Filter<T>(filterRadius, superSample, pixelAspectRatio);
|
||||||
|
else if (filterType == MITCHELL_SPATIAL_FILTER)
|
||||||
|
filter = new MitchellFilter<T>(filterRadius, superSample, pixelAspectRatio);
|
||||||
|
else if (filterType == BLACKMAN_SPATIAL_FILTER)
|
||||||
|
filter = new BlackmanFilter<T>(filterRadius, superSample, pixelAspectRatio);
|
||||||
|
else if (filterType == CATROM_SPATIAL_FILTER)
|
||||||
|
filter = new CatromFilter<T>(filterRadius, superSample, pixelAspectRatio);
|
||||||
|
else if (filterType == HAMMING_SPATIAL_FILTER)
|
||||||
|
filter = new HammingFilter<T>(filterRadius, superSample, pixelAspectRatio);
|
||||||
|
else if (filterType == HANNING_SPATIAL_FILTER)
|
||||||
|
filter = new HanningFilter<T>(filterRadius, superSample, pixelAspectRatio);
|
||||||
|
else if (filterType == QUADRATIC_SPATIAL_FILTER)
|
||||||
|
filter = new QuadraticFilter<T>(filterRadius, superSample, pixelAspectRatio);
|
||||||
|
else
|
||||||
|
filter = new GaussianFilter<T>(filterRadius, superSample, pixelAspectRatio);
|
||||||
|
|
||||||
|
if (filter)
|
||||||
|
filter->Create();
|
||||||
|
|
||||||
|
return filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return a string vector of the available filter types.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>A vector of strings populated with the available filter types</returns>
|
||||||
|
static vector<string> FilterTypes()
|
||||||
|
{
|
||||||
|
vector<string> v;
|
||||||
|
|
||||||
|
v.reserve(14);
|
||||||
|
v.push_back("Gaussian");
|
||||||
|
v.push_back("Hermite");
|
||||||
|
v.push_back("Box");
|
||||||
|
v.push_back("Triangle");
|
||||||
|
v.push_back("Bell");
|
||||||
|
v.push_back("Bspline");
|
||||||
|
v.push_back("Lanczos3");
|
||||||
|
v.push_back("Lanczos2");
|
||||||
|
v.push_back("Mitchell");
|
||||||
|
v.push_back("Blackman");
|
||||||
|
v.push_back("Catrom");
|
||||||
|
v.push_back("Hamming");
|
||||||
|
v.push_back("Hanning");
|
||||||
|
v.push_back("Quadratic");
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convert between the filter name string and its type enum.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterType">The string name of the filter</param>
|
||||||
|
/// <returns>The filter type enum</returns>
|
||||||
|
static eSpatialFilterType FromString(string filterType)
|
||||||
|
{
|
||||||
|
if (!_stricmp(filterType.c_str(), "Gaussian"))
|
||||||
|
return GAUSSIAN_SPATIAL_FILTER;
|
||||||
|
else if (!_stricmp(filterType.c_str(), "Hermite"))
|
||||||
|
return HERMITE_SPATIAL_FILTER;
|
||||||
|
else if (!_stricmp(filterType.c_str(), "Box"))
|
||||||
|
return BOX_SPATIAL_FILTER;
|
||||||
|
else if (!_stricmp(filterType.c_str(), "Triangle"))
|
||||||
|
return TRIANGLE_SPATIAL_FILTER;
|
||||||
|
else if (!_stricmp(filterType.c_str(), "Bell"))
|
||||||
|
return BELL_SPATIAL_FILTER;
|
||||||
|
else if (!_stricmp(filterType.c_str(), "Bspline"))
|
||||||
|
return BSPLINE_SPATIAL_FILTER;
|
||||||
|
else if (!_stricmp(filterType.c_str(), "Lanczos3"))
|
||||||
|
return LANCZOS3_SPATIAL_FILTER;
|
||||||
|
else if (!_stricmp(filterType.c_str(), "Lanczos2"))
|
||||||
|
return LANCZOS2_SPATIAL_FILTER;
|
||||||
|
else if (!_stricmp(filterType.c_str(), "Mitchell"))
|
||||||
|
return MITCHELL_SPATIAL_FILTER;
|
||||||
|
else if (!_stricmp(filterType.c_str(), "Blackman"))
|
||||||
|
return BLACKMAN_SPATIAL_FILTER;
|
||||||
|
else if (!_stricmp(filterType.c_str(), "Catrom"))
|
||||||
|
return CATROM_SPATIAL_FILTER;
|
||||||
|
else if (!_stricmp(filterType.c_str(), "Hamming"))
|
||||||
|
return HAMMING_SPATIAL_FILTER;
|
||||||
|
else if (!_stricmp(filterType.c_str(), "Hanning"))
|
||||||
|
return HANNING_SPATIAL_FILTER;
|
||||||
|
else if (!_stricmp(filterType.c_str(), "Quadratic"))
|
||||||
|
return QUADRATIC_SPATIAL_FILTER;
|
||||||
|
else
|
||||||
|
return GAUSSIAN_SPATIAL_FILTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convert between the filter type enum and its name string.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="eTemporalFilterType">The filter type enum</param>
|
||||||
|
/// <returns>The string name of the filter</returns>
|
||||||
|
static string ToString(eSpatialFilterType filterType)
|
||||||
|
{
|
||||||
|
string filter;
|
||||||
|
|
||||||
|
if (filterType == GAUSSIAN_SPATIAL_FILTER)
|
||||||
|
filter = "Gaussian";
|
||||||
|
else if (filterType == HERMITE_SPATIAL_FILTER)
|
||||||
|
filter = "Hermite";
|
||||||
|
else if (filterType == BOX_SPATIAL_FILTER)
|
||||||
|
filter = "Box";
|
||||||
|
else if (filterType == TRIANGLE_SPATIAL_FILTER)
|
||||||
|
filter = "Triangle";
|
||||||
|
else if (filterType == BELL_SPATIAL_FILTER)
|
||||||
|
filter = "Bell";
|
||||||
|
else if (filterType == BSPLINE_SPATIAL_FILTER)
|
||||||
|
filter = "Bspline";
|
||||||
|
else if (filterType == LANCZOS3_SPATIAL_FILTER)
|
||||||
|
filter = "Lanczos3";
|
||||||
|
else if (filterType == LANCZOS2_SPATIAL_FILTER)
|
||||||
|
filter = "Lanczos2";
|
||||||
|
else if (filterType == MITCHELL_SPATIAL_FILTER)
|
||||||
|
filter = "Mitchell";
|
||||||
|
else if (filterType == BLACKMAN_SPATIAL_FILTER)
|
||||||
|
filter = "Blackman";
|
||||||
|
else if (filterType == CATROM_SPATIAL_FILTER)
|
||||||
|
filter = "Catrom";
|
||||||
|
else if (filterType == HAMMING_SPATIAL_FILTER)
|
||||||
|
filter = "Hamming";
|
||||||
|
else if (filterType == HANNING_SPATIAL_FILTER)
|
||||||
|
filter = "Hanning";
|
||||||
|
else if (filterType == QUADRATIC_SPATIAL_FILTER)
|
||||||
|
filter = "Quadratic";
|
||||||
|
else
|
||||||
|
filter = "Gaussian";
|
||||||
|
|
||||||
|
return filter;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
347
Source/Ember/TemporalFilter.h
Normal file
347
Source/Ember/TemporalFilter.h
Normal file
@ -0,0 +1,347 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "EmberDefines.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// TemporalFilter base, derived and factory classes.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberNs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The types of temporal filters available.
|
||||||
|
/// </summary>
|
||||||
|
enum eTemporalFilterType
|
||||||
|
{
|
||||||
|
BOX_TEMPORAL_FILTER = 0,
|
||||||
|
GAUSSIAN_TEMPORAL_FILTER = 1,
|
||||||
|
EXP_TEMPORAL_FILTER = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Temporal filter is for doing motion blur while rendering a series of frames for animation.
|
||||||
|
/// The filter created is used as a vector of scalar values to multiply the time value by in between embers.
|
||||||
|
/// There are three possible types: Gaussian, Box and Exp.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API TemporalFilter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor to set up basic filtering parameters, allocate buffers and calculate deltas.
|
||||||
|
/// Derived class constructors will complete the final part of filter setup.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterType">Type of the filter.</param>
|
||||||
|
/// <param name="passes">The number of passes used in the ember being rendered</param>
|
||||||
|
/// <param name="temporalSamples">The number of temporal samples in the ember being rendered</param>
|
||||||
|
/// <param name="filterWidth">The width of the filter.</param>
|
||||||
|
TemporalFilter(eTemporalFilterType filterType, unsigned int passes, unsigned int temporalSamples, T filterWidth)
|
||||||
|
{
|
||||||
|
unsigned int i, steps = passes * temporalSamples;
|
||||||
|
|
||||||
|
m_Deltas.resize(steps);
|
||||||
|
m_Filter.resize(steps);
|
||||||
|
m_FilterType = filterType;
|
||||||
|
|
||||||
|
if (steps == 1)
|
||||||
|
{
|
||||||
|
m_SumFilt = 1;
|
||||||
|
m_Deltas[0] = 0;
|
||||||
|
m_Filter[0] = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Define the temporal deltas.
|
||||||
|
for (i = 0; i < steps; i++)
|
||||||
|
m_Deltas[i] = (T(i) / T(steps - 1) - T(0.5)) * filterWidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copy constructor.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filter">The TemporalFilter object to copy</param>
|
||||||
|
TemporalFilter(const TemporalFilter<T>& filter)
|
||||||
|
{
|
||||||
|
*this = filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Virtual destructor so derived class destructors get called.
|
||||||
|
/// </summary>
|
||||||
|
virtual ~TemporalFilter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Assignment operator.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filter">The TemporalFilter object to copy.</param>
|
||||||
|
/// <returns>Reference to updated self</returns>
|
||||||
|
TemporalFilter<T>& operator = (const TemporalFilter<T>& filter)
|
||||||
|
{
|
||||||
|
if (this != &filter)
|
||||||
|
{
|
||||||
|
m_SumFilt = filter.m_SumFilt;
|
||||||
|
m_Deltas = filter.m_Deltas;
|
||||||
|
m_Filter = filter.m_Filter;
|
||||||
|
m_FilterType = filter.m_FilterType;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return a string representation of this filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The string representation of this filter</returns>
|
||||||
|
string ToString() const
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
stringstream ss;
|
||||||
|
|
||||||
|
ss << "Temporal Filter:" << endl
|
||||||
|
<< " Size: " << Size() << endl
|
||||||
|
<< " Type: " << TemporalFilterCreator<T>::ToString(m_FilterType) << endl
|
||||||
|
<< " Sum Filt: " << SumFilt() << endl;
|
||||||
|
|
||||||
|
ss << "Deltas: " << endl;
|
||||||
|
|
||||||
|
for (i = 0; i < m_Deltas.size(); i++)
|
||||||
|
{
|
||||||
|
ss << "Deltas[" << i << "]: " << m_Deltas[i] << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
ss << "Filter: " << endl;
|
||||||
|
|
||||||
|
for (i = 0; i < m_Filter.size(); i++)
|
||||||
|
{
|
||||||
|
ss << "Filter[" << i << "]: " << m_Filter[i] << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Accessors.
|
||||||
|
/// </summary>
|
||||||
|
size_t Size() const { return m_Filter.size(); }
|
||||||
|
T SumFilt() const { return m_SumFilt; }
|
||||||
|
T* Deltas() { return &m_Deltas[0]; }
|
||||||
|
T* Filter() { return &m_Filter[0]; }
|
||||||
|
eTemporalFilterType FilterType() const { return m_FilterType; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// <summary>
|
||||||
|
/// Normalize the filter and the sum filt.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="maxFilt">The maximum filter value contained in the filter vector after it was created</param>
|
||||||
|
void FinishFilter(T maxFilt)
|
||||||
|
{
|
||||||
|
m_SumFilt = 0;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < Size(); i++)
|
||||||
|
{
|
||||||
|
m_Filter[i] /= maxFilt;
|
||||||
|
m_SumFilt += m_Filter[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
m_SumFilt /= Size();
|
||||||
|
}
|
||||||
|
|
||||||
|
T m_SumFilt;//The sum of all filter values.
|
||||||
|
vector<T> m_Deltas;//Delta vector.
|
||||||
|
vector<T> m_Filter;//Filter vector.
|
||||||
|
eTemporalFilterType m_FilterType;//The type of filter this is.
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derivation which implements the Exp filter.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API ExpTemporalFilter : public TemporalFilter<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor to create an Exp filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="passes">The number of passes used in the ember being rendered</param>
|
||||||
|
/// <param name="temporalSamples">The number of temporal samples in the ember being rendered</param>
|
||||||
|
/// <param name="filterWidth">The width of the filter.</param>
|
||||||
|
/// <param name="filterExp">The filter exp.</param>
|
||||||
|
ExpTemporalFilter(unsigned int passes, unsigned int temporalSamples, T filterWidth, T filterExp)
|
||||||
|
: TemporalFilter<T>(BOX_TEMPORAL_FILTER, passes, temporalSamples, filterWidth)
|
||||||
|
{
|
||||||
|
if (Size() > 1)
|
||||||
|
{
|
||||||
|
T slpx, maxFilt = 0;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < Size(); i++)
|
||||||
|
{
|
||||||
|
if (filterExp >= 0)
|
||||||
|
slpx = (T(i) + 1) / Size();
|
||||||
|
else
|
||||||
|
slpx = T(Size() - i) / Size();
|
||||||
|
|
||||||
|
//Scale the color based on these values.
|
||||||
|
m_Filter[i] = pow(slpx, fabs(filterExp));
|
||||||
|
|
||||||
|
//Keep the max.
|
||||||
|
if (m_Filter[i] > maxFilt)
|
||||||
|
maxFilt = m_Filter[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
FinishFilter(maxFilt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derivation which implements the Gaussian filter.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API GaussianTemporalFilter : public TemporalFilter<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor to create a Gaussian filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="passes">The number of passes used in the ember being rendered</param>
|
||||||
|
/// <param name="temporalSamples">The number of temporal samples in the ember being rendered</param>
|
||||||
|
/// <param name="filterWidth">The width of the filter.</param>
|
||||||
|
GaussianTemporalFilter(unsigned int passes, unsigned int temporalSamples, T filterWidth)
|
||||||
|
: TemporalFilter<T>(GAUSSIAN_TEMPORAL_FILTER, passes, temporalSamples, filterWidth)
|
||||||
|
{
|
||||||
|
if (Size() > 1)
|
||||||
|
{
|
||||||
|
T maxFilt = 0, halfSteps = T(Size()) / T(2);
|
||||||
|
GaussianFilter<T> gaussian(1, 1);//Just pass dummy values, they are unused in this case.
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < Size(); i++)
|
||||||
|
{
|
||||||
|
m_Filter[i] = gaussian.Filter(gaussian.Support() * fabs(i - halfSteps) / halfSteps);
|
||||||
|
|
||||||
|
//Keep the max.
|
||||||
|
if (m_Filter[i] > maxFilt)
|
||||||
|
maxFilt = m_Filter[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
FinishFilter(maxFilt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Derivation which implements the Box filter.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API BoxTemporalFilter : public TemporalFilter<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor to create a Box filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="passes">The number of passes used in the ember being rendered</param>
|
||||||
|
/// <param name="temporalSamples">The number of temporal samples in the ember being rendered</param>
|
||||||
|
/// <param name="filterWidth">The width of the filter.</param>
|
||||||
|
BoxTemporalFilter(unsigned int passes, unsigned int temporalSamples, T filterWidth)
|
||||||
|
: TemporalFilter<T>(BOX_TEMPORAL_FILTER, passes, temporalSamples, filterWidth)
|
||||||
|
{
|
||||||
|
if (Size() > 1)
|
||||||
|
{
|
||||||
|
for (unsigned int i = 0; i < Size(); i++)
|
||||||
|
m_Filter[i] = 1;
|
||||||
|
|
||||||
|
FinishFilter(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convenience class to assist in converting between filter names and the filter objects themselves.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API TemporalFilterCreator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Creates the specified filter type based on the filterType enum parameter.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterType">Type of the filter</param>
|
||||||
|
/// <param name="passes">The number of passes used in the ember being rendered</param>
|
||||||
|
/// <param name="temporalSamples">The number of temporal samples in the ember being rendered</param>
|
||||||
|
/// <param name="filterWidth">The width of the filter</param>
|
||||||
|
/// <param name="filterExp">The filter exp, only used with Exp filter, otherwise ignored.</param>
|
||||||
|
/// <returns>A pointer to the newly created filter object</returns>
|
||||||
|
static TemporalFilter<T>* Create(eTemporalFilterType filterType, unsigned int passes, unsigned int temporalSamples, T filterWidth, T filterExp = 1)
|
||||||
|
{
|
||||||
|
TemporalFilter<T>* filter = NULL;
|
||||||
|
|
||||||
|
if (filterType == BOX_TEMPORAL_FILTER)
|
||||||
|
filter = new BoxTemporalFilter<T>(passes, temporalSamples, filterWidth);
|
||||||
|
else if (filterType == GAUSSIAN_TEMPORAL_FILTER)
|
||||||
|
filter = new GaussianTemporalFilter<T>(passes, temporalSamples, filterWidth);
|
||||||
|
else if (filterType == EXP_TEMPORAL_FILTER)
|
||||||
|
filter = new ExpTemporalFilter<T>(passes, temporalSamples, filterWidth, filterExp);
|
||||||
|
else
|
||||||
|
filter = new BoxTemporalFilter<T>(passes, temporalSamples, filterWidth);//Default to box if bad enum passed in.
|
||||||
|
|
||||||
|
return filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return a string vector of the available filter types.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>A vector of strings populated with the available filter types</returns>
|
||||||
|
static vector<string> FilterTypes()
|
||||||
|
{
|
||||||
|
vector<string> v;
|
||||||
|
|
||||||
|
v.reserve(3);
|
||||||
|
v.push_back("Box");
|
||||||
|
v.push_back("Gaussian");
|
||||||
|
v.push_back("Exp");
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convert between the filter name string and its type enum.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterType">The string name of the filter</param>
|
||||||
|
/// <returns>The filter type enum</returns>
|
||||||
|
static eTemporalFilterType FromString(string filterType)
|
||||||
|
{
|
||||||
|
if (!_stricmp(filterType.c_str(), "box"))
|
||||||
|
return BOX_TEMPORAL_FILTER;
|
||||||
|
else if (!_stricmp(filterType.c_str(), "gaussian"))
|
||||||
|
return GAUSSIAN_TEMPORAL_FILTER;
|
||||||
|
else if (!_stricmp(filterType.c_str(), "exp"))
|
||||||
|
return EXP_TEMPORAL_FILTER;
|
||||||
|
else
|
||||||
|
return BOX_TEMPORAL_FILTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convert between the filter type enum and its name string.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="eTemporalFilterType">The filter type enum</param>
|
||||||
|
/// <returns>The string name of the filter</returns>
|
||||||
|
static string ToString(eTemporalFilterType filterType)
|
||||||
|
{
|
||||||
|
string filter;
|
||||||
|
|
||||||
|
if (filterType == BOX_TEMPORAL_FILTER)
|
||||||
|
filter = "Box";
|
||||||
|
else if (filterType == GAUSSIAN_TEMPORAL_FILTER)
|
||||||
|
filter = "Gaussian";
|
||||||
|
else if (filterType == EXP_TEMPORAL_FILTER)
|
||||||
|
filter = "Exp";
|
||||||
|
else
|
||||||
|
filter = "Box";
|
||||||
|
|
||||||
|
return filter;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
7
Source/Ember/Timing.cpp
Normal file
7
Source/Ember/Timing.cpp
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
#include "Timing.h"
|
||||||
|
|
||||||
|
namespace Flam3
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
231
Source/Ember/Timing.h
Normal file
231
Source/Ember/Timing.h
Normal file
@ -0,0 +1,231 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "EmberDefines.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Timing and CriticalSection classes.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberNs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Since the algorithm is so computationally intensive, timing and benchmarking are an integral portion
|
||||||
|
/// of both the development process and the execution results. This class provides an easy way to time
|
||||||
|
/// things by simply calling its Tic() and Toc() member functions. It also assists with formatting the
|
||||||
|
/// elapsed time as a string.
|
||||||
|
/// </summary>
|
||||||
|
class EMBER_API Timing
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor that takes an optional precision argument which specifies how many digits after the decimal place should be printed for seconds.
|
||||||
|
/// As a convenience, the Tic() function is called automatically.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="precision">The precision of the seconds field of the elapsed time. Default: 2.</param>
|
||||||
|
Timing(int precision = 2)
|
||||||
|
{
|
||||||
|
m_Precision = precision;
|
||||||
|
Init();
|
||||||
|
Tic();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the begin time.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The quad part of the begin time cast to a double</returns>
|
||||||
|
double Tic()
|
||||||
|
{
|
||||||
|
QueryPerformanceCounter(&m_BeginTime);
|
||||||
|
return BeginTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the end time and optionally output a string showing the elapsed time.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="str">The string to output. Default: NULL.</param>
|
||||||
|
/// <param name="fullString">If true, output the string verbatim, else output the text " processing time: " in between str and the formatted time.</param>
|
||||||
|
/// <returns>The elapsed time in milliseconds as a double</returns>
|
||||||
|
double Toc(const char* str = NULL, bool fullString = false)
|
||||||
|
{
|
||||||
|
QueryPerformanceCounter(&m_EndTime);
|
||||||
|
double ms = ElapsedTime();
|
||||||
|
|
||||||
|
if (str != NULL)
|
||||||
|
{
|
||||||
|
cout << string(str) << (fullString ? "" : " processing time: ") << Format(ms) << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the quad part of the begin time as a double.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
double BeginTime() { return (double)m_BeginTime.QuadPart; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the quad part of the end time as a double.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
double EndTime() { return (double)m_EndTime.QuadPart; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the elapsed time in milliseconds.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The elapsed time in milliseconds as a double</returns>
|
||||||
|
double ElapsedTime() { return double(m_EndTime.QuadPart - m_BeginTime.QuadPart) * 1000.0 / double(m_Freq.QuadPart); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Formats a specified milliseconds value as a string.
|
||||||
|
/// This uses some intelligence to determine what to return depending on how much time has elapsed.
|
||||||
|
/// Days, hours and minutes are only included if 1 or more of them has elapsed. Seconds are always
|
||||||
|
/// included as a decimal value with the precision the user specified in the constructor.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ms">The ms</param>
|
||||||
|
/// <returns>The formatted string</returns>
|
||||||
|
string Format(double ms)
|
||||||
|
{
|
||||||
|
stringstream ss;
|
||||||
|
|
||||||
|
double x = ms / 1000;
|
||||||
|
double secs = fmod(x, 60);
|
||||||
|
x /= 60;
|
||||||
|
double mins = fmod(x, 60);
|
||||||
|
x /= 60;
|
||||||
|
double hours = fmod(x, 24);
|
||||||
|
x /= 24;
|
||||||
|
double days = x;
|
||||||
|
|
||||||
|
if (days >= 1)
|
||||||
|
ss << (int)days << "d ";
|
||||||
|
|
||||||
|
if (hours >= 1)
|
||||||
|
ss << (int)hours << "h ";
|
||||||
|
|
||||||
|
if (mins >= 1)
|
||||||
|
ss << (int)mins << "m ";
|
||||||
|
|
||||||
|
ss << std::fixed << std::setprecision(m_Precision) << secs << "s";
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the frequency of the clock as a double.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
static double Freq()
|
||||||
|
{
|
||||||
|
Init();
|
||||||
|
return (double)m_Freq.QuadPart;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the number of cores in the system.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The number of cores in the system</returns>
|
||||||
|
static int ProcessorCount()
|
||||||
|
{
|
||||||
|
Init();
|
||||||
|
return m_ProcessorCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// <summary>
|
||||||
|
/// Query and store the performance info of the system.
|
||||||
|
/// Since it will never change it only needs to be queried once.
|
||||||
|
/// This is achieved by keeping static state and performance variables.
|
||||||
|
/// </summary>
|
||||||
|
static void Init()
|
||||||
|
{
|
||||||
|
if (!m_TimingInit)
|
||||||
|
{
|
||||||
|
SYSTEM_INFO sysinfo;
|
||||||
|
|
||||||
|
QueryPerformanceFrequency(&m_Freq);
|
||||||
|
GetSystemInfo(&sysinfo);
|
||||||
|
m_ProcessorCount = sysinfo.dwNumberOfProcessors;
|
||||||
|
m_TimingInit = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int m_Precision;//How many digits after the decimal place to print for seconds.
|
||||||
|
LARGE_INTEGER m_BeginTime;//The start of the timing, set with Tic().
|
||||||
|
LARGE_INTEGER m_EndTime;//The end of the timing, set with Toc().
|
||||||
|
static bool m_TimingInit;//Whether the performance info has bee queried.
|
||||||
|
static int m_ProcessorCount;//The number of cores on the system, set in Init().
|
||||||
|
static LARGE_INTEGER m_Freq;//The clock frequency, set in Init().
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Cross platform critical section class which can be used for thread locking.
|
||||||
|
/// </summary>
|
||||||
|
class EMBER_API CriticalSection
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which initialized the underlying CRITICAL_SECTION object.
|
||||||
|
/// </summary>
|
||||||
|
CriticalSection() { InitializeCriticalSection(&m_CriticalSection); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which initialized the underlying CRITICAL_SECTION object
|
||||||
|
/// with the specified spin count value.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="spinCount">The spin count.</param>
|
||||||
|
CriticalSection(DWORD spinCount) { InitializeCriticalSectionAndSpinCount(&m_CriticalSection, spinCount); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Deletes the underlying CRITICAL_SECTION object.
|
||||||
|
/// </summary>
|
||||||
|
~CriticalSection() { DeleteCriticalSection(&m_CriticalSection); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Lock the critical section.
|
||||||
|
/// </summary>
|
||||||
|
void Enter() { EnterCriticalSection(&m_CriticalSection); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unlock the critical section.
|
||||||
|
/// </summary>
|
||||||
|
void Leave() { LeaveCriticalSection(&m_CriticalSection); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
CRITICAL_SECTION m_CriticalSection;//The Windows specific critical section object.
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which initialized the underlying pthread_mutex_t object.
|
||||||
|
/// </summary>
|
||||||
|
CriticalSection()
|
||||||
|
{
|
||||||
|
pthread_mutexattr_t attr;
|
||||||
|
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL);
|
||||||
|
pthread_mutex_init(&m_CriticalSection, &attr);
|
||||||
|
pthread_mutexattr_destroy(&attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Deletes the underlying pthread_mutex_t object.
|
||||||
|
/// </summary>
|
||||||
|
~CriticalSection() { pthread_mutex_destroy(&m_CriticalSection); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Lock the critical section.
|
||||||
|
/// </summary>
|
||||||
|
void Enter() { pthread_mutex_lock(&m_CriticalSection); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unlock the critical section.
|
||||||
|
/// </summary>
|
||||||
|
void Leave() { pthread_mutex_unlock(&m_CriticalSection); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
pthread_mutex_t m_CriticalSection;//The *nix/pthread specific critical section object.
|
||||||
|
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
}
|
887
Source/Ember/Utils.h
Normal file
887
Source/Ember/Utils.h
Normal file
@ -0,0 +1,887 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Isaac.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Global utility classes and functions that don't really fit anywhere else, but are
|
||||||
|
/// too small to justify being in their own file.
|
||||||
|
/// </summary>
|
||||||
|
namespace EmberNs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// After a run completes, information about what was run can be saved as strings to the comments
|
||||||
|
/// section of a jpg or png file. This class is just a container for those values.
|
||||||
|
/// </summary>
|
||||||
|
class EMBER_API EmberImageComments
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Set all values to the empty string.
|
||||||
|
/// </summary>
|
||||||
|
void Clear()
|
||||||
|
{
|
||||||
|
m_Genome = "";
|
||||||
|
m_Badvals = "";
|
||||||
|
m_NumIters = "";
|
||||||
|
m_Runtime = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
string m_Genome;
|
||||||
|
string m_Badvals;
|
||||||
|
string m_NumIters;
|
||||||
|
string m_Runtime;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Since running is an incredibly complex process with multiple points of possible failure,
|
||||||
|
/// it's important that as much information as possible is captured if something goes wrong.
|
||||||
|
/// Classes wishing to capture this failure information will derive from this class and populate
|
||||||
|
/// the vector of strings with any useful error information. Note that a small complication can occur
|
||||||
|
/// when a class derives from this class, yet also has one or more members which do too. In that case, they should
|
||||||
|
/// override the methods to aggregate the error information from themselves, as well as their members.
|
||||||
|
/// </summary>
|
||||||
|
class EMBER_API EmberReport
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Write the entire error report as a single string to the console.
|
||||||
|
/// Derived classes with members that also derive from EmberReport should override this to capture
|
||||||
|
/// their error information as well as that of their members.
|
||||||
|
/// </summary>
|
||||||
|
virtual void DumpErrorReport() { cout << ErrorReportString(); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clear the error report string vector.
|
||||||
|
/// Derived classes with members that also derive from EmberReport should override this to clear
|
||||||
|
/// their error information as well as that of their members.
|
||||||
|
/// </summary>
|
||||||
|
virtual void ClearErrorReport() { m_ErrorReport.clear(); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the entire error report as a single string.
|
||||||
|
/// Derived classes with members that also derive from EmberReport should override this to capture
|
||||||
|
/// their error information as well as that of their members.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The entire error report as a single string. Empty if no errors.</returns>
|
||||||
|
virtual string ErrorReportString() { return StaticErrorReportString(m_ErrorReport); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the entire error report as a vector of strings.
|
||||||
|
/// Derived classes with members that also derive from EmberReport should override this to capture
|
||||||
|
/// their error information as well as that of their members.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The entire error report as a vector of strings. Empty if no errors.</returns>
|
||||||
|
virtual vector<string> ErrorReport() { return m_ErrorReport; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Add string to report.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="s">The string to add</param>
|
||||||
|
virtual void AddToReport(string s) { m_ErrorReport.push_back(s); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Add a vector of strings to report.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="vec">The vector of strings to add</param>
|
||||||
|
virtual void AddToReport(vector<string>& vec) { m_ErrorReport.insert(m_ErrorReport.end(), vec.begin(), vec.end()); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Static function to dump a vector of strings passed in.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="errorReport">The vector of strings to dump</param>
|
||||||
|
static void StaticDumpErrorReport(vector<string>& errorReport) { cout << StaticErrorReportString(errorReport); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Static function to return the entire error report passed in as a single string.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="errorReport">The vector of strings to concatenate</param>
|
||||||
|
/// <returns>A string containing all strings in the vector passed in separated by newlines</returns>
|
||||||
|
static string StaticErrorReportString(vector<string>& errorReport)
|
||||||
|
{
|
||||||
|
stringstream ss;
|
||||||
|
|
||||||
|
std::for_each(errorReport.begin() , errorReport.end() , [&](string s) { ss << s << endl; });
|
||||||
|
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
vector<string> m_ErrorReport;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Open a file in binary mode and read its entire contents into a vector of unsigned chars. Optionally null terminate.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filename">The full path to the file to read</param>
|
||||||
|
/// <param name="buf">The vector which will be populated with the file's contents</param>
|
||||||
|
/// <param name="nullTerminate">Whether to append a NULL character as the last element of the vector. Needed when reading text files. Default: true.</param>
|
||||||
|
/// <returns>True if successfully read and populated, else false</returns>
|
||||||
|
static bool ReadFile(const char* filename, string& buf, bool nullTerminate = true)
|
||||||
|
{
|
||||||
|
bool b = false;
|
||||||
|
FILE* f;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
fopen_s(&f, filename, "rb");//Open in binary mode.
|
||||||
|
|
||||||
|
if (f != NULL)
|
||||||
|
{
|
||||||
|
struct _stat statBuf;
|
||||||
|
int statResult = _fstat(f->_file, &statBuf);//Get data associated with file.
|
||||||
|
|
||||||
|
if (statResult == 0)//Check if statistics are valid.
|
||||||
|
{
|
||||||
|
buf.resize(statBuf.st_size + (nullTerminate ? 1 : 0));//Allocate vector to be the size of the entire file, with an optional additional character for NULL.
|
||||||
|
|
||||||
|
if (buf.size() == statBuf.st_size + 1)//Ensure allocation succeeded.
|
||||||
|
{
|
||||||
|
size_t bytesRead = fread(&buf[0], 1, statBuf.st_size, f);//Read the entire file at once.
|
||||||
|
|
||||||
|
if (bytesRead == statBuf.st_size)//Ensure the number of bytes read matched what was requested.
|
||||||
|
{
|
||||||
|
if (nullTerminate)//Optionally NULL terminate if they want to treat it as a string.
|
||||||
|
buf[buf.size() - 1] = NULL;
|
||||||
|
|
||||||
|
b = true;//Success.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
if (f != NULL)
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
b = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clear dest and copy all of the elements of vector source with elements of type U to the vector
|
||||||
|
/// dest with elements of type T.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dest">The vector of type T to copy to</param>
|
||||||
|
/// <param name="source">The vector of type U to copy from</param>
|
||||||
|
template <typename T, typename U>
|
||||||
|
void CopyVec(vector<T>& dest, const vector<U>& source)
|
||||||
|
{
|
||||||
|
dest.clear();
|
||||||
|
dest.resize(source.size());
|
||||||
|
|
||||||
|
for (size_t i = 0; i < source.size(); i++)
|
||||||
|
dest[i] = T(source[i]);//Valid assignment operator between T and U types must be defined somewhere.
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clear a vector of pointers to any type by checking each element for NULL and calling delete on it, then clearing the entire vector.
|
||||||
|
/// Optionally call array delete if the elements themselves are pointers to dynamically allocated arrays.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="vec">The vector to be cleared</param>
|
||||||
|
/// <param name="arrayDelete">Whether to call delete or delete []. Default: false.</param>
|
||||||
|
template <typename T>
|
||||||
|
static void ClearVec(vector<T*>& vec, bool arrayDelete = false)
|
||||||
|
{
|
||||||
|
for (unsigned int i = 0; i < vec.size(); i++)
|
||||||
|
{
|
||||||
|
if (vec[i] != NULL)
|
||||||
|
{
|
||||||
|
if (arrayDelete)
|
||||||
|
delete [] vec[i];
|
||||||
|
else
|
||||||
|
delete vec[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
vec[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convert an RGBA buffer to an RGB buffer.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="rgba">The RGBA buffer</param>
|
||||||
|
/// <param name="rgb">The RGB buffer</param>
|
||||||
|
/// <param name="width">The width of the image in pixels</param>
|
||||||
|
/// <param name="height">The height of the image in pixels</param>
|
||||||
|
static void RgbaToRgb(vector<unsigned char>& rgba, vector<unsigned char>& rgb, unsigned int width, unsigned int height)
|
||||||
|
{
|
||||||
|
rgb.resize(width * height * 3);
|
||||||
|
|
||||||
|
for (unsigned int i = 0, j = 0; i < (width * height * 4); i += 4, j += 3)
|
||||||
|
{
|
||||||
|
rgb[j] = rgba[i];
|
||||||
|
rgb[j + 1] = rgba[i + 1];
|
||||||
|
rgb[j + 2] = rgba[i + 2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clamp and return a value to be greater than or equal to a specified minimum and less than
|
||||||
|
/// or equal to a specified maximum.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="val">The value to be clamped</param>
|
||||||
|
/// <param name="min">A value which the clamped value must be greater than or equal to</param>
|
||||||
|
/// <param name="max">A value which the clamped value must be less than or equal to</param>
|
||||||
|
/// <returns>The clamped value</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T Clamp(T val, T min, T max)
|
||||||
|
{
|
||||||
|
if (val < min)
|
||||||
|
return min;
|
||||||
|
else if (val > max)
|
||||||
|
return max;
|
||||||
|
else
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clamp and return a value to be greater than or equal to a specified minimum and less than
|
||||||
|
/// or equal to a specified maximum. If lesser, the value is fmod(val - min, max - min). If greater,
|
||||||
|
/// the value is max - fmod(max - val, max - min).
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="val">The value to be clamped</param>
|
||||||
|
/// <param name="min">A value which the clamped value must be greater than or equal to</param>
|
||||||
|
/// <param name="max">A value which the clamped value must be less than or equal to</param>
|
||||||
|
/// <returns>The clamped and modded value</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T ClampMod(T val, T min, T max)
|
||||||
|
{
|
||||||
|
if (val < min)
|
||||||
|
return min + fmod(val - min, max - min);
|
||||||
|
else if (val > max)
|
||||||
|
return max - fmod(max - val, max - min);
|
||||||
|
else
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Similar to Clamp(), but clamps a reference value in place rather than returning.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="val">The reference value to be clamped in place</param>
|
||||||
|
/// <param name="min">A value which the clamped value must be greater than or equal to</param>
|
||||||
|
/// <param name="max">A value which the clamped value must be less than or equal to</param>
|
||||||
|
template <typename T>
|
||||||
|
static inline void ClampRef(T& val, T min, T max)
|
||||||
|
{
|
||||||
|
if (val < min)
|
||||||
|
val = min;
|
||||||
|
else if (val > max)
|
||||||
|
val = max;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Similar to Clamp(), but clamps a reference value in place rather than returning.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="val">The reference value to be clamped in place</param>
|
||||||
|
/// <param name="gte">A value which the clamped value must be less than or equal to</param>
|
||||||
|
template <typename T>
|
||||||
|
static inline void ClampLteRef(T& val, T lte)
|
||||||
|
{
|
||||||
|
if (val > lte)
|
||||||
|
val = lte;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clamp and return a value to be greater than or equal to a specified value.
|
||||||
|
/// Useful for ensuring something is not less than zero.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="val">The value to be clamped</param>
|
||||||
|
/// <param name="gte">A value which the clamped value must be greater than or equal to</param>
|
||||||
|
/// <returns>The clamped value</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T ClampGte(T val, T gte)
|
||||||
|
{
|
||||||
|
return (val < gte) ? gte : val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Similar to Clamp(), but clamps a reference value in place rather than returning.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="val">The reference value to be clamped in place</param>
|
||||||
|
/// <param name="gte">A value which the clamped value must be greater than or equal to</param>
|
||||||
|
template <typename T>
|
||||||
|
static inline void ClampGteRef(T& val, T gte)
|
||||||
|
{
|
||||||
|
if (val < gte)
|
||||||
|
val = gte;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Thin wrapper around a call to ClampGte() with a gte value of zero.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="val">The value to be clamped</param>
|
||||||
|
/// <returns>The clamped value</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T ClampGte0(T val)
|
||||||
|
{
|
||||||
|
return ClampGte<T>(val, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Thin wrapper around a call to ClampGteRef() with a gte value of zero.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="val">The reference value to be clamped in place</param>
|
||||||
|
template <typename T>
|
||||||
|
static inline void ClampGte0Ref(T& val)
|
||||||
|
{
|
||||||
|
ClampGteRef<T>(val, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return a value rounded up or down. Works for positive and negative numbers.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="r">The value to round</param>
|
||||||
|
/// <returns>The rounded value</returns>
|
||||||
|
template <typename T>
|
||||||
|
T Round(T r)
|
||||||
|
{
|
||||||
|
return (r > 0) ? (T)Floor<T>(r + T(0.5)) : ceil(r - T(0.5));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Special rounding for certain variations, gotten from Apophysis.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">The value to round</param>
|
||||||
|
/// <returns>The rounded value</returns>
|
||||||
|
inline float LRint(float x)
|
||||||
|
{
|
||||||
|
int temp = (x >= 0 ? (int)(x + 0.5f) : (int)(x - 0.5f));
|
||||||
|
return (float)temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Special rounding for certain variations, gotten from Apophysis.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">The value to round</param>
|
||||||
|
/// <returns>The rounded value</returns>
|
||||||
|
inline double LRint(double x)
|
||||||
|
{
|
||||||
|
__int64 temp = (x >= 0 ? (__int64)(x + 0.5) : (__int64)(x - 0.5));
|
||||||
|
return (double)temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// System floor() extremely slow because it accounts for various error conditions.
|
||||||
|
/// This is a much faster version that works on data that is not NaN.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">The value to return the floor of</param>
|
||||||
|
/// <returns>The floored value</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline int Floor(T val)
|
||||||
|
{
|
||||||
|
if (val >= 0)
|
||||||
|
{
|
||||||
|
return (int)val;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int i = (int)val;//Truncate.
|
||||||
|
return i - (i > val);//Convert trunc to floor.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Never really understood what this did.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="r">The value to round</param>
|
||||||
|
/// <returns>The rounded value</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T Round6(T r)
|
||||||
|
{
|
||||||
|
r *= 1e6;
|
||||||
|
|
||||||
|
if (r < 0)
|
||||||
|
r -= 1;
|
||||||
|
|
||||||
|
return T(1e-6 * (int)(r + T(0.5)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return -1 if the value is less than 0, 1 if it's greater and
|
||||||
|
/// 0 if it's equal to 0.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="v">The value to inspect</param>
|
||||||
|
/// <returns>-1, 0 or 1</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T Sign(T v)
|
||||||
|
{
|
||||||
|
return (v < 0) ? T(-1) : (v > 0) ? T(1) : T(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return -1 if the value is less than 0, 1 if it's greater.
|
||||||
|
/// This differs from Sign() in that it doesn't return 0.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="v">The value to inspect</param>
|
||||||
|
/// <returns>-1 or 1</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T SignNz(T v)
|
||||||
|
{
|
||||||
|
return (v < 0) ? T(-1) : T(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the square of the passed in value.
|
||||||
|
/// This is useful when the value is a result of a computation
|
||||||
|
/// rather than a fixed number. Otherwise, use the SQR macro.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="v">The value to square</param>
|
||||||
|
/// <returns>The squared value</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T Sqr(T t)
|
||||||
|
{
|
||||||
|
return t * t;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Taking the square root of numbers close to zero is dangerous. If x is negative
|
||||||
|
/// due to floating point errors, it can return NaN results.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
static inline T SafeSqrt(T x)
|
||||||
|
{
|
||||||
|
if (x <= 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return sqrt(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the cube of the passed in value.
|
||||||
|
/// This is useful when the value is a result of a computation
|
||||||
|
/// rather than a fixed number. Otherwise, use the CUBE macro.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="v">The value to cube</param>
|
||||||
|
/// <returns>The cubed value</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T Cube(T t)
|
||||||
|
{
|
||||||
|
return t * t * t;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the hypotenuse of the passed in values.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">The x distance</param>
|
||||||
|
/// <param name="y">The y distance</param>
|
||||||
|
/// <returns>The hypotenuse</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T Hypot(T x, T y)
|
||||||
|
{
|
||||||
|
return sqrt(SQR(x) + SQR(y));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Spread the values.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">The x distance</param>
|
||||||
|
/// <param name="y">The y distance</param>
|
||||||
|
/// <returns>The spread</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T Spread(T x, T y)
|
||||||
|
{
|
||||||
|
return Hypot<T>(x, y) * ((x) > 0 ? 1 : -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unsure.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">The x distance</param>
|
||||||
|
/// <param name="y">The y distance</param>
|
||||||
|
/// <returns>The powq4</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T Powq4(T x, T y)
|
||||||
|
{
|
||||||
|
return pow(fabs(x), y) * SignNz(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unsure.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">The x distance</param>
|
||||||
|
/// <param name="y">The y distance</param>
|
||||||
|
/// <returns>The powq4c</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T Powq4c(T x, T y)
|
||||||
|
{
|
||||||
|
return y == 1 ? x : Powq4(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return EPS6 if the passed in value was zero, else return the value.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">The value</param>
|
||||||
|
/// <param name="y">The y distance</param>
|
||||||
|
/// <returns>EPS6 or the value if it was non-zero</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T Zeps(T x)
|
||||||
|
{
|
||||||
|
return x == 0 ? EPS6 : x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Interpolate a given percentage between two values.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="a">The first value to interpolate between.</param>
|
||||||
|
/// <param name="b">The secod value to interpolate between.</param>
|
||||||
|
/// <param name="p">The percentage between the two values to calculate.</param>
|
||||||
|
/// <returns>The interpolated value.</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T Lerp(T a, T b, T p)
|
||||||
|
{
|
||||||
|
return a + (b - a) * p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Thin wrapper around a call to modf that discards the integer portion
|
||||||
|
/// and returns the signed fractional portion.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="v">The value to retrieve the signed fractional portion of.</param>
|
||||||
|
/// <returns>The signed fractional portion of v.</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T Fabsmod(T v)
|
||||||
|
{
|
||||||
|
T dummy;
|
||||||
|
|
||||||
|
return modf(v, &dummy);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unsure.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="p">Unsure.</param>
|
||||||
|
/// <param name="amp">Unsure.</param>
|
||||||
|
/// <param name="ph">Unsure.</param>
|
||||||
|
/// <returns>Unsure.</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T Fosc(T p, T amp, T ph)
|
||||||
|
{
|
||||||
|
return T(0.5) - cos(p * amp + ph) * T(0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unsure.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="p">Unsure.</param>
|
||||||
|
/// <param name="ph">Unsure.</param>
|
||||||
|
/// <returns>Unsure.</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T Foscn(T p, T ph)
|
||||||
|
{
|
||||||
|
return T(0.5) - cos(p + ph) * T(0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Log scale from Apophysis.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">The value to log scale</param>
|
||||||
|
/// <returns>The log scaled value</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T LogScale(T x)
|
||||||
|
{
|
||||||
|
return x == 0 ? 0 : log((fabs(x) + 1) * T(M_E)) * SignNz(x) / T(M_E);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Log map from Apophysis.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">The value to log map</param>
|
||||||
|
/// <returns>The log mapped value</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T LogMap(T x)
|
||||||
|
{
|
||||||
|
return x == 0 ? 0 : (T(M_E) + log(x * T(M_E))) * T(0.25) * SignNz(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Thin wrapper around calling xmlStrcmp() on an Xml tag to tell
|
||||||
|
/// if its name is a given value.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name of the tag of the to inspect</param>
|
||||||
|
/// <param name="val">The value compare against</param>
|
||||||
|
/// <returns>True if the comparison matched, else false</returns>
|
||||||
|
static inline bool Compare(const xmlChar* name, char* val)
|
||||||
|
{
|
||||||
|
return xmlStrcmp(name, XC val) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determine whether the specified value is very close to zero.
|
||||||
|
/// This is useful for determining equality of float/double types.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="val">The value to compare against</param>
|
||||||
|
/// <param name="tolerance">The tolerance. Default: 1e-6.</param>
|
||||||
|
/// <returns>True if the value was very close to zero, else false</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline bool IsNearZero(T val, T tolerance = 1e-6)
|
||||||
|
{
|
||||||
|
return (val > -tolerance && val < tolerance);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determine whether a specified value is very close to another value.
|
||||||
|
/// This is useful for determining equality of float/double types.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="val1">The first value.</param>
|
||||||
|
/// <param name="val2">The second value.</param>
|
||||||
|
/// <param name="tolerance">The tolerance. Default: 1e-6.</param>
|
||||||
|
/// <returns>True if the values were very close to each other, else false</returns>
|
||||||
|
template <typename T>
|
||||||
|
static bool IsClose(T val1, T val2, T tolerance = 1e-6)
|
||||||
|
{
|
||||||
|
return IsNearZero(val1 - val2, tolerance);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Put an angular measurement in degrees into the range of -180 - 180.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="angle">The angle to normalize</param>
|
||||||
|
/// <returns>The normalized angle in a range of -180 - 180</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T NormalizeDeg180(T angle)
|
||||||
|
{
|
||||||
|
angle = fmod(angle, 360);
|
||||||
|
|
||||||
|
if (angle > 180)
|
||||||
|
{
|
||||||
|
angle -= 360;
|
||||||
|
}
|
||||||
|
else if (angle < -180)
|
||||||
|
{
|
||||||
|
angle += 360;
|
||||||
|
}
|
||||||
|
|
||||||
|
return angle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Put an angular measurement in degrees into the range of 0 - 360.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="angle">The angle to normalize</param>
|
||||||
|
/// <returns>The normalized angle in a range of 0 - 360</returns>
|
||||||
|
template <typename T>
|
||||||
|
static inline T NormalizeDeg360(T angle)
|
||||||
|
{
|
||||||
|
if (angle > 360 || angle < -360)
|
||||||
|
angle = fmod(angle, 360);
|
||||||
|
|
||||||
|
if (angle < 0)
|
||||||
|
angle += 360;
|
||||||
|
|
||||||
|
return angle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return a lower case copy of a string.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="str">The string to copy and make lower case</param>
|
||||||
|
/// <returns>The lower case string</returns>
|
||||||
|
static inline string ToLower(string& str)
|
||||||
|
{
|
||||||
|
string lower;
|
||||||
|
|
||||||
|
lower.resize(str.size());//Allocate the destination space.
|
||||||
|
std::transform(str.begin(), str.end(), lower.begin(), ::tolower);//Convert the source string to lower case storing the result in the destination string.
|
||||||
|
return lower;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return an upper case copy of a string.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="str">The string to copy and make upper case</param>
|
||||||
|
/// <returns>The upper case string</returns>
|
||||||
|
static inline string ToUpper(string& str)
|
||||||
|
{
|
||||||
|
string upper;
|
||||||
|
|
||||||
|
upper.resize(str.size());//Allocate the destination space.
|
||||||
|
std::transform(str.begin(), str.end(), upper.begin(), ::toupper);//Convert the source string to lower case storing the result in the destination string.
|
||||||
|
return upper;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return a copy of a string with leading and trailing occurrences of a specified character removed.
|
||||||
|
/// The default character is a space.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="str">The string to trim</param>
|
||||||
|
/// <param name="ch">The character to trim. Default: space.</param>
|
||||||
|
/// <returns>The trimmed string</returns>
|
||||||
|
static inline string Trim(string& str, char ch = ' ')
|
||||||
|
{
|
||||||
|
string ret;
|
||||||
|
|
||||||
|
if (str != "")
|
||||||
|
{
|
||||||
|
size_t firstChar = str.find_first_not_of(ch);
|
||||||
|
size_t lastChar = str.find_last_not_of(ch);
|
||||||
|
|
||||||
|
if (firstChar == string::npos)
|
||||||
|
firstChar = 0;
|
||||||
|
|
||||||
|
if (lastChar == string::npos)
|
||||||
|
lastChar = str.size();
|
||||||
|
|
||||||
|
ret = str.substr(firstChar, lastChar - firstChar + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Placeholder for a templated function to query the value of a specified system environment variable
|
||||||
|
/// of a specific type. This function does nothing as the functions for specific types implement the behavior
|
||||||
|
/// via template specialization.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name of the environment variable to query</param>
|
||||||
|
/// <param name="def">The default value to return if the environment variable was not present</param>
|
||||||
|
/// <returns>The value of the specified environment variable if found, else default</returns>
|
||||||
|
template <typename T>
|
||||||
|
static T Arg(char* name, T def)
|
||||||
|
{
|
||||||
|
T t;
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Template specialization for Arg<>() with a type of int.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name of the environment variable to query</param>
|
||||||
|
/// <param name="def">The default value to return if the environment variable was not present</param>
|
||||||
|
/// <returns>The value of the specified environment variable if found, else default</returns>
|
||||||
|
template <>
|
||||||
|
static int Arg<int>(char* name, int def)
|
||||||
|
{
|
||||||
|
char* ch;
|
||||||
|
int returnVal;
|
||||||
|
size_t len;
|
||||||
|
errno_t err = _dupenv_s(&ch, &len, name);
|
||||||
|
|
||||||
|
if (err || !ch)
|
||||||
|
returnVal = def;
|
||||||
|
else
|
||||||
|
returnVal = atoi(ch);
|
||||||
|
|
||||||
|
free(ch);
|
||||||
|
return returnVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Template specialization for Arg<>() with a type of unsigned int.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name of the environment variable to query</param>
|
||||||
|
/// <param name="def">The default value to return if the environment variable was not present</param>
|
||||||
|
/// <returns>The value of the specified environment variable if found, else default</returns>
|
||||||
|
template <>
|
||||||
|
static unsigned int Arg<unsigned int>(char* name, unsigned int def)
|
||||||
|
{
|
||||||
|
return Arg<int>(name, (int)def);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Template specialization for Arg<>() with a type of bool.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name of the environment variable to query</param>
|
||||||
|
/// <param name="def">The default value to return if the environment variable was not present</param>
|
||||||
|
/// <returns>The value of the specified environment variable if found, else default</returns>
|
||||||
|
template <>
|
||||||
|
static bool Arg<bool>(char* name, bool def)
|
||||||
|
{
|
||||||
|
return (Arg<int>(name, -999) != -999) ? true : def;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Template specialization for Arg<>() with a type of double.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name of the environment variable to query</param>
|
||||||
|
/// <param name="def">The default value to return if the environment variable was not present</param>
|
||||||
|
/// <returns>The value of the specified environment variable if found, else default</returns>
|
||||||
|
template <>
|
||||||
|
static double Arg<double>(char* name, double def)
|
||||||
|
{
|
||||||
|
char* ch;
|
||||||
|
double returnVal;
|
||||||
|
size_t len;
|
||||||
|
errno_t err = _dupenv_s(&ch, &len, name);
|
||||||
|
|
||||||
|
if (err || !ch)
|
||||||
|
returnVal = def;
|
||||||
|
else
|
||||||
|
returnVal = atof(ch);
|
||||||
|
|
||||||
|
free(ch);
|
||||||
|
return returnVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Template specialization for Arg<>() with a type of string.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name of the environment variable to query</param>
|
||||||
|
/// <param name="def">The default value to return if the environment variable was not present</param>
|
||||||
|
/// <returns>The value of the specified environment variable if found, else default</returns>
|
||||||
|
template <>
|
||||||
|
static string Arg<string>(char* name, string def)
|
||||||
|
{
|
||||||
|
char* ch;
|
||||||
|
string returnVal;
|
||||||
|
size_t len;
|
||||||
|
errno_t err = _dupenv_s(&ch, &len, name);
|
||||||
|
|
||||||
|
if (err || !ch)
|
||||||
|
{
|
||||||
|
if (def != "")
|
||||||
|
returnVal = def;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
returnVal = string(ch);
|
||||||
|
|
||||||
|
free(ch);
|
||||||
|
return returnVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Replaces all instances of a value within a collection, with the specified value.
|
||||||
|
/// Taken from a StackOverflow.com post.
|
||||||
|
/// Modified to account for the scenario where the find and replace strings each start with
|
||||||
|
/// the same character.
|
||||||
|
/// Template argument should be any STL container.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="source">Collection to replace values in</param>
|
||||||
|
/// <param name="find">The value to replace</param>
|
||||||
|
/// <param name="replace">The value to replace with</param>
|
||||||
|
/// <returns>The number of instances replaced</returns>
|
||||||
|
template<typename T>
|
||||||
|
unsigned int inline FindAndReplace(T& source, const T& find, const T& replace)
|
||||||
|
{
|
||||||
|
unsigned int replaceCount = 0;
|
||||||
|
typename T::size_type fLen = find.size();
|
||||||
|
typename T::size_type rLen = replace.size();
|
||||||
|
|
||||||
|
for (typename T::size_type pos = 0; (pos = source.find(find, pos)) != T::npos; pos += rLen)
|
||||||
|
{
|
||||||
|
typename T::size_type pos2 = source.find(replace, pos);
|
||||||
|
|
||||||
|
if (pos != pos2)
|
||||||
|
{
|
||||||
|
replaceCount++;
|
||||||
|
source.replace(pos, fLen, replace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return replaceCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return a character pointer to a version string composed of the EMBER_OS and EMBER_VERSION values.
|
||||||
|
/// </summary>
|
||||||
|
static char* EmberVersion()
|
||||||
|
{
|
||||||
|
return EMBER_OS "-" EMBER_VERSION;
|
||||||
|
}
|
||||||
|
}
|
2168
Source/Ember/Variation.h
Normal file
2168
Source/Ember/Variation.h
Normal file
File diff suppressed because it is too large
Load Diff
537
Source/Ember/VariationList.h
Normal file
537
Source/Ember/VariationList.h
Normal file
@ -0,0 +1,537 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Variations01.h"
|
||||||
|
#include "Variations02.h"
|
||||||
|
#include "Variations03.h"
|
||||||
|
#include "Variations04.h"
|
||||||
|
#include "Variations05.h"
|
||||||
|
#include "VariationsDC.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// VariationList class.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberNs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Since the list of variations is numerous, it's convenient to be able to make copies
|
||||||
|
/// of specific ones. This class holds a list of pointers to variation objects for every
|
||||||
|
/// variation available. Similar to the PaletteList class, a caller can look up a variation
|
||||||
|
/// by name or ID and retrieve a copy of it.
|
||||||
|
/// All variations are deleted upon destruction.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBER_API VariationList
|
||||||
|
{
|
||||||
|
#define ADDPREPOSTREGVAR(varName) \
|
||||||
|
m_Variations.push_back(new varName##Variation<T>()); \
|
||||||
|
m_Variations.push_back(new Pre##varName##Variation<T>()); \
|
||||||
|
m_Variations.push_back(new Post##varName##Variation<T>());
|
||||||
|
|
||||||
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor which initializes all of the variation objects and stores them in the list.
|
||||||
|
/// </summary>
|
||||||
|
VariationList()
|
||||||
|
{
|
||||||
|
m_Variations.reserve(900);//Change this as the list grows.
|
||||||
|
ADDPREPOSTREGVAR(Linear)
|
||||||
|
ADDPREPOSTREGVAR(Sinusoidal)
|
||||||
|
ADDPREPOSTREGVAR(Spherical)
|
||||||
|
ADDPREPOSTREGVAR(Swirl)
|
||||||
|
ADDPREPOSTREGVAR(Horseshoe)
|
||||||
|
ADDPREPOSTREGVAR(Polar)
|
||||||
|
ADDPREPOSTREGVAR(Handkerchief)
|
||||||
|
ADDPREPOSTREGVAR(Heart)
|
||||||
|
ADDPREPOSTREGVAR(Disc)
|
||||||
|
ADDPREPOSTREGVAR(Spiral)
|
||||||
|
ADDPREPOSTREGVAR(Hyperbolic)
|
||||||
|
ADDPREPOSTREGVAR(Diamond)
|
||||||
|
ADDPREPOSTREGVAR(Ex)
|
||||||
|
ADDPREPOSTREGVAR(Julia)
|
||||||
|
ADDPREPOSTREGVAR(Bent)
|
||||||
|
ADDPREPOSTREGVAR(Waves)
|
||||||
|
ADDPREPOSTREGVAR(Fisheye)
|
||||||
|
ADDPREPOSTREGVAR(Popcorn)
|
||||||
|
ADDPREPOSTREGVAR(Exponential)
|
||||||
|
ADDPREPOSTREGVAR(Power)
|
||||||
|
ADDPREPOSTREGVAR(Cosine)
|
||||||
|
ADDPREPOSTREGVAR(Rings)
|
||||||
|
ADDPREPOSTREGVAR(Fan)
|
||||||
|
ADDPREPOSTREGVAR(Blob)
|
||||||
|
ADDPREPOSTREGVAR(Pdj)
|
||||||
|
ADDPREPOSTREGVAR(Fan2)
|
||||||
|
ADDPREPOSTREGVAR(Rings2)
|
||||||
|
ADDPREPOSTREGVAR(Eyefish)
|
||||||
|
ADDPREPOSTREGVAR(Bubble)
|
||||||
|
ADDPREPOSTREGVAR(Cylinder)
|
||||||
|
ADDPREPOSTREGVAR(Perspective)
|
||||||
|
ADDPREPOSTREGVAR(Noise)
|
||||||
|
ADDPREPOSTREGVAR(JuliaNGeneric)
|
||||||
|
ADDPREPOSTREGVAR(JuliaScope)
|
||||||
|
ADDPREPOSTREGVAR(Blur)
|
||||||
|
ADDPREPOSTREGVAR(GaussianBlur)
|
||||||
|
ADDPREPOSTREGVAR(RadialBlur)
|
||||||
|
ADDPREPOSTREGVAR(Pie)
|
||||||
|
ADDPREPOSTREGVAR(Ngon)
|
||||||
|
ADDPREPOSTREGVAR(Curl)
|
||||||
|
ADDPREPOSTREGVAR(Rectangles)
|
||||||
|
ADDPREPOSTREGVAR(Arch)
|
||||||
|
ADDPREPOSTREGVAR(Tangent)
|
||||||
|
ADDPREPOSTREGVAR(Square)
|
||||||
|
ADDPREPOSTREGVAR(Rays)
|
||||||
|
ADDPREPOSTREGVAR(Blade)
|
||||||
|
ADDPREPOSTREGVAR(Secant2)
|
||||||
|
ADDPREPOSTREGVAR(TwinTrian)
|
||||||
|
ADDPREPOSTREGVAR(Cross)
|
||||||
|
ADDPREPOSTREGVAR(Disc2)
|
||||||
|
ADDPREPOSTREGVAR(SuperShape)
|
||||||
|
ADDPREPOSTREGVAR(Flower)
|
||||||
|
ADDPREPOSTREGVAR(Conic)
|
||||||
|
ADDPREPOSTREGVAR(Parabola)
|
||||||
|
ADDPREPOSTREGVAR(Bent2)
|
||||||
|
ADDPREPOSTREGVAR(Bipolar)
|
||||||
|
ADDPREPOSTREGVAR(Boarders)
|
||||||
|
ADDPREPOSTREGVAR(Butterfly)
|
||||||
|
ADDPREPOSTREGVAR(Cell)
|
||||||
|
ADDPREPOSTREGVAR(Cpow)
|
||||||
|
ADDPREPOSTREGVAR(Curve)
|
||||||
|
ADDPREPOSTREGVAR(Edisc)
|
||||||
|
ADDPREPOSTREGVAR(Elliptic)
|
||||||
|
ADDPREPOSTREGVAR(Escher)
|
||||||
|
ADDPREPOSTREGVAR(Foci)
|
||||||
|
ADDPREPOSTREGVAR(LazySusan)
|
||||||
|
ADDPREPOSTREGVAR(Loonie)
|
||||||
|
ADDPREPOSTREGVAR(Modulus)
|
||||||
|
ADDPREPOSTREGVAR(Oscilloscope)
|
||||||
|
ADDPREPOSTREGVAR(Polar2)
|
||||||
|
ADDPREPOSTREGVAR(Popcorn2)
|
||||||
|
ADDPREPOSTREGVAR(Scry)
|
||||||
|
ADDPREPOSTREGVAR(Separation)
|
||||||
|
ADDPREPOSTREGVAR(Split)
|
||||||
|
ADDPREPOSTREGVAR(Splits)
|
||||||
|
ADDPREPOSTREGVAR(Stripes)
|
||||||
|
ADDPREPOSTREGVAR(Wedge)
|
||||||
|
ADDPREPOSTREGVAR(WedgeJulia)
|
||||||
|
ADDPREPOSTREGVAR(WedgeSph)
|
||||||
|
ADDPREPOSTREGVAR(Whorl)
|
||||||
|
ADDPREPOSTREGVAR(Waves2)
|
||||||
|
ADDPREPOSTREGVAR(Exp)
|
||||||
|
ADDPREPOSTREGVAR(Log)
|
||||||
|
ADDPREPOSTREGVAR(Sin)
|
||||||
|
ADDPREPOSTREGVAR(Cos)
|
||||||
|
ADDPREPOSTREGVAR(Tan)
|
||||||
|
ADDPREPOSTREGVAR(Sec)
|
||||||
|
ADDPREPOSTREGVAR(Csc)
|
||||||
|
ADDPREPOSTREGVAR(Cot)
|
||||||
|
ADDPREPOSTREGVAR(Sinh)
|
||||||
|
ADDPREPOSTREGVAR(Cosh)
|
||||||
|
ADDPREPOSTREGVAR(Tanh)
|
||||||
|
ADDPREPOSTREGVAR(Sech)
|
||||||
|
ADDPREPOSTREGVAR(Csch)
|
||||||
|
ADDPREPOSTREGVAR(Coth)
|
||||||
|
ADDPREPOSTREGVAR(Auger)
|
||||||
|
ADDPREPOSTREGVAR(Flux)
|
||||||
|
ADDPREPOSTREGVAR(Hemisphere)
|
||||||
|
ADDPREPOSTREGVAR(Epispiral)
|
||||||
|
ADDPREPOSTREGVAR(Bwraps)
|
||||||
|
ADDPREPOSTREGVAR(BlurCircle)
|
||||||
|
ADDPREPOSTREGVAR(BlurZoom)
|
||||||
|
ADDPREPOSTREGVAR(BlurPixelize)
|
||||||
|
ADDPREPOSTREGVAR(Crop)
|
||||||
|
ADDPREPOSTREGVAR(BCircle)
|
||||||
|
ADDPREPOSTREGVAR(BlurLinear)
|
||||||
|
ADDPREPOSTREGVAR(BlurSquare)
|
||||||
|
ADDPREPOSTREGVAR(Boarders2)
|
||||||
|
ADDPREPOSTREGVAR(Cardioid)
|
||||||
|
ADDPREPOSTREGVAR(Checks)
|
||||||
|
ADDPREPOSTREGVAR(Circlize)
|
||||||
|
ADDPREPOSTREGVAR(Circlize2)
|
||||||
|
ADDPREPOSTREGVAR(CosWrap)
|
||||||
|
ADDPREPOSTREGVAR(DeltaA)
|
||||||
|
ADDPREPOSTREGVAR(Expo)
|
||||||
|
ADDPREPOSTREGVAR(Extrude)
|
||||||
|
ADDPREPOSTREGVAR(FDisc)
|
||||||
|
ADDPREPOSTREGVAR(Fibonacci)
|
||||||
|
ADDPREPOSTREGVAR(Fibonacci2)
|
||||||
|
ADDPREPOSTREGVAR(Glynnia)
|
||||||
|
ADDPREPOSTREGVAR(GridOut)
|
||||||
|
ADDPREPOSTREGVAR(Hole)
|
||||||
|
ADDPREPOSTREGVAR(Hypertile)
|
||||||
|
ADDPREPOSTREGVAR(Hypertile1)
|
||||||
|
ADDPREPOSTREGVAR(Hypertile2)
|
||||||
|
ADDPREPOSTREGVAR(Hypertile3D)
|
||||||
|
ADDPREPOSTREGVAR(Hypertile3D1)
|
||||||
|
ADDPREPOSTREGVAR(Hypertile3D2)
|
||||||
|
ADDPREPOSTREGVAR(IDisc)
|
||||||
|
ADDPREPOSTREGVAR(Julian2)
|
||||||
|
ADDPREPOSTREGVAR(JuliaQ)
|
||||||
|
ADDPREPOSTREGVAR(Murl)
|
||||||
|
ADDPREPOSTREGVAR(Murl2)
|
||||||
|
ADDPREPOSTREGVAR(NPolar)
|
||||||
|
ADDPREPOSTREGVAR(Ortho)
|
||||||
|
ADDPREPOSTREGVAR(Poincare)
|
||||||
|
ADDPREPOSTREGVAR(Poincare3D)
|
||||||
|
ADDPREPOSTREGVAR(Polynomial)
|
||||||
|
ADDPREPOSTREGVAR(PSphere)
|
||||||
|
ADDPREPOSTREGVAR(Rational3)
|
||||||
|
ADDPREPOSTREGVAR(Ripple)
|
||||||
|
ADDPREPOSTREGVAR(Sigmoid)
|
||||||
|
ADDPREPOSTREGVAR(SinusGrid)
|
||||||
|
ADDPREPOSTREGVAR(Stwin)
|
||||||
|
ADDPREPOSTREGVAR(TwoFace)
|
||||||
|
ADDPREPOSTREGVAR(Unpolar)
|
||||||
|
ADDPREPOSTREGVAR(WavesN)
|
||||||
|
ADDPREPOSTREGVAR(XHeart)
|
||||||
|
ADDPREPOSTREGVAR(Barycentroid)
|
||||||
|
ADDPREPOSTREGVAR(BiSplit)
|
||||||
|
ADDPREPOSTREGVAR(Crescents)
|
||||||
|
ADDPREPOSTREGVAR(Mask)
|
||||||
|
ADDPREPOSTREGVAR(Cpow2)
|
||||||
|
ADDPREPOSTREGVAR(Curl3D)
|
||||||
|
ADDPREPOSTREGVAR(Disc3D)
|
||||||
|
ADDPREPOSTREGVAR(Funnel)
|
||||||
|
ADDPREPOSTREGVAR(Linear3D)
|
||||||
|
ADDPREPOSTREGVAR(PowBlock)
|
||||||
|
ADDPREPOSTREGVAR(Squirrel)
|
||||||
|
ADDPREPOSTREGVAR(Ennepers)
|
||||||
|
ADDPREPOSTREGVAR(SphericalN)
|
||||||
|
ADDPREPOSTREGVAR(Kaleidoscope)
|
||||||
|
ADDPREPOSTREGVAR(GlynnSim1)
|
||||||
|
ADDPREPOSTREGVAR(GlynnSim2)
|
||||||
|
ADDPREPOSTREGVAR(GlynnSim3)
|
||||||
|
ADDPREPOSTREGVAR(Starblur)
|
||||||
|
ADDPREPOSTREGVAR(Sineblur)
|
||||||
|
ADDPREPOSTREGVAR(Circleblur)
|
||||||
|
ADDPREPOSTREGVAR(CropN)
|
||||||
|
ADDPREPOSTREGVAR(ShredRad)
|
||||||
|
ADDPREPOSTREGVAR(Blob2)
|
||||||
|
ADDPREPOSTREGVAR(Julia3D)
|
||||||
|
ADDPREPOSTREGVAR(Julia3Dz)
|
||||||
|
ADDPREPOSTREGVAR(LinearT)
|
||||||
|
ADDPREPOSTREGVAR(LinearT3D)
|
||||||
|
ADDPREPOSTREGVAR(Ovoid)
|
||||||
|
ADDPREPOSTREGVAR(Ovoid3D)
|
||||||
|
ADDPREPOSTREGVAR(Spirograph)
|
||||||
|
ADDPREPOSTREGVAR(Petal)
|
||||||
|
ADDPREPOSTREGVAR(RoundSpher)
|
||||||
|
ADDPREPOSTREGVAR(RoundSpher3D)
|
||||||
|
ADDPREPOSTREGVAR(SpiralWing)
|
||||||
|
ADDPREPOSTREGVAR(Squarize)
|
||||||
|
ADDPREPOSTREGVAR(Sschecks)
|
||||||
|
ADDPREPOSTREGVAR(PhoenixJulia)
|
||||||
|
ADDPREPOSTREGVAR(Mobius)
|
||||||
|
ADDPREPOSTREGVAR(MobiusN)
|
||||||
|
ADDPREPOSTREGVAR(MobiusStrip)
|
||||||
|
ADDPREPOSTREGVAR(Lissajous)
|
||||||
|
ADDPREPOSTREGVAR(Svf)
|
||||||
|
ADDPREPOSTREGVAR(Target)
|
||||||
|
ADDPREPOSTREGVAR(Taurus)
|
||||||
|
ADDPREPOSTREGVAR(Collideoscope)
|
||||||
|
ADDPREPOSTREGVAR(BMod)
|
||||||
|
ADDPREPOSTREGVAR(BSwirl)
|
||||||
|
ADDPREPOSTREGVAR(BTransform)
|
||||||
|
ADDPREPOSTREGVAR(BCollide)
|
||||||
|
ADDPREPOSTREGVAR(Eclipse)
|
||||||
|
ADDPREPOSTREGVAR(FlipCircle)
|
||||||
|
ADDPREPOSTREGVAR(FlipY)
|
||||||
|
ADDPREPOSTREGVAR(ECollide)
|
||||||
|
ADDPREPOSTREGVAR(EJulia)
|
||||||
|
ADDPREPOSTREGVAR(EMod)
|
||||||
|
ADDPREPOSTREGVAR(EMotion)
|
||||||
|
ADDPREPOSTREGVAR(EPush)
|
||||||
|
ADDPREPOSTREGVAR(ERotate)
|
||||||
|
ADDPREPOSTREGVAR(EScale)
|
||||||
|
ADDPREPOSTREGVAR(ESwirl)
|
||||||
|
ADDPREPOSTREGVAR(LazyTravis)
|
||||||
|
ADDPREPOSTREGVAR(Squish)
|
||||||
|
ADDPREPOSTREGVAR(Circus)
|
||||||
|
ADDPREPOSTREGVAR(Tancos)
|
||||||
|
ADDPREPOSTREGVAR(Rippled)
|
||||||
|
ADDPREPOSTREGVAR(RotateX)
|
||||||
|
ADDPREPOSTREGVAR(RotateY)
|
||||||
|
ADDPREPOSTREGVAR(RotateZ)
|
||||||
|
ADDPREPOSTREGVAR(Flatten)
|
||||||
|
ADDPREPOSTREGVAR(Zblur)
|
||||||
|
ADDPREPOSTREGVAR(Blur3D)
|
||||||
|
ADDPREPOSTREGVAR(ZScale)
|
||||||
|
ADDPREPOSTREGVAR(ZTranslate)
|
||||||
|
ADDPREPOSTREGVAR(ZCone)
|
||||||
|
ADDPREPOSTREGVAR(MirrorX)
|
||||||
|
ADDPREPOSTREGVAR(MirrorY)
|
||||||
|
ADDPREPOSTREGVAR(MirrorZ)
|
||||||
|
ADDPREPOSTREGVAR(Depth)
|
||||||
|
ADDPREPOSTREGVAR(Spherical3D)
|
||||||
|
ADDPREPOSTREGVAR(RBlur)
|
||||||
|
ADDPREPOSTREGVAR(JuliaNab)
|
||||||
|
ADDPREPOSTREGVAR(Sintrange)
|
||||||
|
ADDPREPOSTREGVAR(Voron)
|
||||||
|
ADDPREPOSTREGVAR(Waffle)
|
||||||
|
ADDPREPOSTREGVAR(Square3D)
|
||||||
|
ADDPREPOSTREGVAR(SuperShape3D)
|
||||||
|
ADDPREPOSTREGVAR(Sphyp3D)
|
||||||
|
ADDPREPOSTREGVAR(Circlecrop)
|
||||||
|
ADDPREPOSTREGVAR(Julian3Dx)
|
||||||
|
ADDPREPOSTREGVAR(Fourth)
|
||||||
|
ADDPREPOSTREGVAR(Mobiq)
|
||||||
|
ADDPREPOSTREGVAR(Spherivoid)
|
||||||
|
ADDPREPOSTREGVAR(Farblur)
|
||||||
|
ADDPREPOSTREGVAR(CurlSP)
|
||||||
|
ADDPREPOSTREGVAR(Heat)
|
||||||
|
ADDPREPOSTREGVAR(Interference2)
|
||||||
|
ADDPREPOSTREGVAR(Sinq)
|
||||||
|
ADDPREPOSTREGVAR(Sinhq)
|
||||||
|
ADDPREPOSTREGVAR(Secq)
|
||||||
|
ADDPREPOSTREGVAR(Sechq)
|
||||||
|
ADDPREPOSTREGVAR(Tanq)
|
||||||
|
ADDPREPOSTREGVAR(Tanhq)
|
||||||
|
ADDPREPOSTREGVAR(Cosq)
|
||||||
|
ADDPREPOSTREGVAR(Coshq)
|
||||||
|
ADDPREPOSTREGVAR(Cotq)
|
||||||
|
ADDPREPOSTREGVAR(Cothq)
|
||||||
|
ADDPREPOSTREGVAR(Cscq)
|
||||||
|
ADDPREPOSTREGVAR(Cschq)
|
||||||
|
ADDPREPOSTREGVAR(Estiq)
|
||||||
|
ADDPREPOSTREGVAR(Loq)
|
||||||
|
ADDPREPOSTREGVAR(Curvature)
|
||||||
|
ADDPREPOSTREGVAR(Qode)
|
||||||
|
ADDPREPOSTREGVAR(BlurHeart)
|
||||||
|
ADDPREPOSTREGVAR(Truchet)
|
||||||
|
ADDPREPOSTREGVAR(Gdoffs)
|
||||||
|
ADDPREPOSTREGVAR(Octagon)
|
||||||
|
ADDPREPOSTREGVAR(Trade)
|
||||||
|
ADDPREPOSTREGVAR(Juliac)
|
||||||
|
ADDPREPOSTREGVAR(Blade3D)
|
||||||
|
ADDPREPOSTREGVAR(Blob3D)
|
||||||
|
ADDPREPOSTREGVAR(Blocky)
|
||||||
|
ADDPREPOSTREGVAR(Bubble2)
|
||||||
|
ADDPREPOSTREGVAR(CircleLinear)
|
||||||
|
ADDPREPOSTREGVAR(CircleRand)
|
||||||
|
ADDPREPOSTREGVAR(CircleTrans1)
|
||||||
|
ADDPREPOSTREGVAR(Cubic3D)
|
||||||
|
ADDPREPOSTREGVAR(CubicLattice3D)
|
||||||
|
ADDPREPOSTREGVAR(Foci3D)
|
||||||
|
ADDPREPOSTREGVAR(Ho)
|
||||||
|
ADDPREPOSTREGVAR(Julia3Dq)
|
||||||
|
ADDPREPOSTREGVAR(Line)
|
||||||
|
ADDPREPOSTREGVAR(Loonie3D)
|
||||||
|
ADDPREPOSTREGVAR(Mcarpet)
|
||||||
|
ADDPREPOSTREGVAR(Waves23D)
|
||||||
|
ADDPREPOSTREGVAR(Pie3D)
|
||||||
|
ADDPREPOSTREGVAR(Popcorn23D)
|
||||||
|
ADDPREPOSTREGVAR(Sinusoidal3D)
|
||||||
|
ADDPREPOSTREGVAR(Scry3D)
|
||||||
|
ADDPREPOSTREGVAR(Shredlin)
|
||||||
|
ADDPREPOSTREGVAR(SplitBrdr)
|
||||||
|
ADDPREPOSTREGVAR(Wdisc)
|
||||||
|
ADDPREPOSTREGVAR(Falloff)
|
||||||
|
ADDPREPOSTREGVAR(Falloff2)
|
||||||
|
ADDPREPOSTREGVAR(Falloff3)
|
||||||
|
ADDPREPOSTREGVAR(Xtrb)
|
||||||
|
//ADDPREPOSTREGVAR(LinearXZ)
|
||||||
|
//ADDPREPOSTREGVAR(LinearYZ)
|
||||||
|
|
||||||
|
//DC are special.
|
||||||
|
m_Variations.push_back(new DCBubbleVariation<T>());
|
||||||
|
ADDPREPOSTREGVAR(DCCarpet)
|
||||||
|
ADDPREPOSTREGVAR(DCCube)
|
||||||
|
m_Variations.push_back(new DCCylinderVariation<T>());
|
||||||
|
ADDPREPOSTREGVAR(DCGridOut)
|
||||||
|
m_Variations.push_back(new DCLinearVariation<T>());
|
||||||
|
ADDPREPOSTREGVAR(DCTriangle)
|
||||||
|
ADDPREPOSTREGVAR(DCZTransl)
|
||||||
|
|
||||||
|
std::for_each(m_Variations.begin(), m_Variations.end(), [&](Variation<T>* var) { var->Precalc(); });
|
||||||
|
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_PreVariations.reserve(m_Variations.size() / 3);
|
||||||
|
m_PostVariations.reserve(m_Variations.size() / 3);
|
||||||
|
|
||||||
|
std::for_each(m_Variations.begin(), m_Variations.end(), [&](Variation<T>* var) { if (var->VarType() == VARTYPE_REG) m_RegVariations.push_back(var); });
|
||||||
|
std::for_each(m_Variations.begin(), m_Variations.end(), [&](Variation<T>* var) { if (var->VarType() == VARTYPE_PRE) m_PreVariations.push_back(var); });
|
||||||
|
std::for_each(m_Variations.begin(), m_Variations.end(), [&](Variation<T>* var) { if (var->VarType() == VARTYPE_POST) m_PostVariations.push_back(var); });
|
||||||
|
|
||||||
|
//Keep a list of which variations derive from ParametricVariation.
|
||||||
|
//Note that these are not new copies, rather just pointers to the original instances in m_Variations.
|
||||||
|
for (unsigned int i = 0; i < m_Variations.size(); i++)
|
||||||
|
{
|
||||||
|
if (ParametricVariation<T>* parVar = dynamic_cast<ParametricVariation<T>*>(m_Variations[i]))
|
||||||
|
m_ParametricVariations.push_back(parVar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Delete each element of the list.
|
||||||
|
/// </summary>
|
||||||
|
~VariationList()
|
||||||
|
{
|
||||||
|
ClearVec(m_Variations);//No need to delete parametric because they point to the entries in original vector.
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get a pointer to the variation at the specified index.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="index">The index in the list to retrieve</param>
|
||||||
|
/// <returns>A pointer to the variation at the index if in range, else NULL.</returns>
|
||||||
|
Variation<T>* GetVariation(size_t index) { return index < m_Variations.size() ? m_Variations[index] : NULL; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get a pointer to the variation of a specified type at the specified index.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="index">The index in the list to retrieve</param>
|
||||||
|
/// <param name="varType">The type of variation to retrieve</param>
|
||||||
|
/// <returns>A pointer to the variation of the specified type at the index if in range, else NULL.</returns>
|
||||||
|
Variation<T>* GetVariation(size_t index, eVariationType varType)
|
||||||
|
{
|
||||||
|
if (varType == VARTYPE_REG)
|
||||||
|
return index < m_RegVariations.size() ? m_RegVariations[index] : NULL;
|
||||||
|
else if (varType == VARTYPE_PRE)
|
||||||
|
return index < m_PreVariations.size() ? m_PreVariations[index] : NULL;
|
||||||
|
else if (varType == VARTYPE_POST)
|
||||||
|
return index < m_PostVariations.size() ? m_PostVariations[index] : NULL;
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a pointer to a copy of the variation at the specified index.
|
||||||
|
/// Optionally specify a weight to assign the new copy.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="index">The index in the list to make a copy of</param>
|
||||||
|
/// <param name="weight">The weight to assign the new copy. Default: 1</param>
|
||||||
|
/// <returns>A pointer to the variation at the index if in range, else NULL.</returns>
|
||||||
|
Variation<T>* GetVariationCopy(size_t index, T weight = 1) { return MakeCopyWithWeight(GetVariation(index), weight); }
|
||||||
|
Variation<T>* GetVariationCopy(size_t index, eVariationType varType, T weight = 1) { return MakeCopyWithWeight(GetVariation(index, varType), weight); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get a pointer to the variation with the specified ID.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">The ID to search for</param>
|
||||||
|
/// <returns>A pointer to the variation if found, else NULL.</returns>
|
||||||
|
Variation<T>* GetVariation(eVariationId id)
|
||||||
|
{
|
||||||
|
for (unsigned int i = 0; i < m_Variations.size() && m_Variations[i] != NULL; i++)
|
||||||
|
if (id == m_Variations[i]->VariationId())
|
||||||
|
return m_Variations[i];
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a pointer to a copy of the variation with the specified ID.
|
||||||
|
/// Optionally specify a weight to assign the new copy.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">The id of the variation in the list to make a copy of</param>
|
||||||
|
/// <param name="weight">The weight to assign the new copy. Default: 1</param>
|
||||||
|
/// <returns>A pointer to the variation with a matching ID, else NULL.</returns>
|
||||||
|
Variation<T>* GetVariationCopy(eVariationId id, T weight = 1) { return MakeCopyWithWeight(GetVariation(id), weight); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get a pointer to the variation with the specified name.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name to search for</param>
|
||||||
|
/// <returns>A pointer to the variation if found, else NULL.</returns>
|
||||||
|
Variation<T>* GetVariation(string name)
|
||||||
|
{
|
||||||
|
for (unsigned int i = 0; i < m_Variations.size() && m_Variations[i] != NULL; i++)
|
||||||
|
if (name == m_Variations[i]->Name())
|
||||||
|
return m_Variations[i];
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a pointer to a copy of the variation with the specified name.
|
||||||
|
/// Optionally specify a weight to assign the new copy.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name of the variation in the list to make a copy of</param>
|
||||||
|
/// <param name="weight">The weight to assign the new copy. Default: 1</param>
|
||||||
|
/// <returns>A pointer to the variation with a matching name, else NULL.</returns>
|
||||||
|
Variation<T>* GetVariationCopy(string name, T weight = 1) { return MakeCopyWithWeight(GetVariation(name), weight); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get a parametric variation at the specified index.
|
||||||
|
/// Note this is the index in the parametric variations list, not in the master list.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="index">The index in the parametric variations list to retrieve</param>
|
||||||
|
/// <returns>The parametric variation at the index specified if in range, else NULL.</returns>
|
||||||
|
ParametricVariation<T>* GetParametricVariation(size_t index) { return index < m_ParametricVariations.size() ? m_ParametricVariations[index] : NULL; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get a parametric variation with the specified name.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name of the variation in the parametric variations list to retrieve</param>
|
||||||
|
/// <returns>The parametric variation with a matching name, else NULL.</returns>
|
||||||
|
ParametricVariation<T>* GetParametricVariation(string name)
|
||||||
|
{
|
||||||
|
for (unsigned int i = 0; i < m_ParametricVariations.size() && m_ParametricVariations[i] != NULL; i++)
|
||||||
|
if (name == m_ParametricVariations[i]->Name())
|
||||||
|
return m_ParametricVariations[i];
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the index of the variation with the specified name.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name of the variation whose index is returned</param>
|
||||||
|
/// <returns>The index of the variation with the matching name, else -1</returns>
|
||||||
|
int GetVariationIndex(string name)
|
||||||
|
{
|
||||||
|
for (unsigned int i = 0; i < m_Variations.size() && m_Variations[i] != NULL; i++)
|
||||||
|
if (name == m_Variations[i]->Name())
|
||||||
|
return i;
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Accessors.
|
||||||
|
/// </summary>
|
||||||
|
size_t Size() { return m_Variations.size(); }
|
||||||
|
size_t RegSize() { return m_RegVariations.size(); }
|
||||||
|
size_t PreSize() { return m_PreVariations.size(); }
|
||||||
|
size_t PostSize() { return m_PostVariations.size(); }
|
||||||
|
size_t ParametricSize() { return m_ParametricVariations.size(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// <summary>
|
||||||
|
/// Make a dyncamically allocated copy of a variation and assign it a specified weight.
|
||||||
|
/// Return a pointer to the new copy.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="var">The variation to copy</param>
|
||||||
|
/// <param name="weight">The weight to assign it</param>
|
||||||
|
/// <returns>A pointer to the new variation copy if success, else NULL.</returns>
|
||||||
|
Variation<T>* MakeCopyWithWeight(Variation<T>* var, T weight)
|
||||||
|
{
|
||||||
|
if (var)
|
||||||
|
{
|
||||||
|
Variation<T>* var2 = var->Copy();
|
||||||
|
|
||||||
|
var2->m_Weight = weight;
|
||||||
|
return var2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Assignment operator which does nothing since these are non-copyable.
|
||||||
|
/// Do not provide a copy constructor and ensure the assignment operator does nothing.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="varList">The VariationList object which won't be copied</param>
|
||||||
|
/// <returns>Reference to unchanged self</returns>
|
||||||
|
VariationList<T>& operator = (const VariationList<T>& varList)
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<Variation<T>*> m_Variations;//A list of pointers to dynamically allocated variation objects.
|
||||||
|
vector<Variation<T>*> m_RegVariations;
|
||||||
|
vector<Variation<T>*> m_PreVariations;
|
||||||
|
vector<Variation<T>*> m_PostVariations;
|
||||||
|
vector<ParametricVariation<T>*> m_ParametricVariations;//A list of pointers to elements in m_Variations which are derived from ParametricVariation.
|
||||||
|
};
|
||||||
|
}
|
6296
Source/Ember/Variations01.h
Normal file
6296
Source/Ember/Variations01.h
Normal file
File diff suppressed because it is too large
Load Diff
5756
Source/Ember/Variations02.h
Normal file
5756
Source/Ember/Variations02.h
Normal file
File diff suppressed because it is too large
Load Diff
4596
Source/Ember/Variations03.h
Normal file
4596
Source/Ember/Variations03.h
Normal file
File diff suppressed because it is too large
Load Diff
5233
Source/Ember/Variations04.h
Normal file
5233
Source/Ember/Variations04.h
Normal file
File diff suppressed because it is too large
Load Diff
3253
Source/Ember/Variations05.h
Normal file
3253
Source/Ember/Variations05.h
Normal file
File diff suppressed because it is too large
Load Diff
1039
Source/Ember/VariationsDC.h
Normal file
1039
Source/Ember/VariationsDC.h
Normal file
File diff suppressed because it is too large
Load Diff
1173
Source/Ember/Xform.h
Normal file
1173
Source/Ember/Xform.h
Normal file
File diff suppressed because it is too large
Load Diff
1350
Source/Ember/XmlToEmber.h
Normal file
1350
Source/Ember/XmlToEmber.h
Normal file
File diff suppressed because it is too large
Load Diff
372
Source/EmberAnimate/EmberAnimate.cpp
Normal file
372
Source/EmberAnimate/EmberAnimate.cpp
Normal file
@ -0,0 +1,372 @@
|
|||||||
|
#include "EmberCommonPch.h"
|
||||||
|
#include "EmberAnimate.h"
|
||||||
|
#include "JpegUtils.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The core of the EmberAnimate.exe program.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="opt">A populated EmberOptions object which specifies all program options to be used</param>
|
||||||
|
/// <returns>True if success, else false.</returns>
|
||||||
|
template <typename T, typename bucketT>
|
||||||
|
bool EmberAnimate(EmberOptions& opt)
|
||||||
|
{
|
||||||
|
OpenCLWrapper wrapper;
|
||||||
|
|
||||||
|
std::cout.imbue(std::locale(""));
|
||||||
|
|
||||||
|
if (opt.DumpArgs())
|
||||||
|
cout << opt.GetValues(OPT_USE_ANIMATE) << endl;
|
||||||
|
|
||||||
|
if (opt.OpenCLInfo())
|
||||||
|
{
|
||||||
|
cout << "\nOpenCL Info: " << endl;
|
||||||
|
cout << wrapper.DumpInfo();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Regular variables.
|
||||||
|
Timing t;
|
||||||
|
bool unsorted = false;
|
||||||
|
bool writeSuccess = false;
|
||||||
|
bool startXml = false;
|
||||||
|
bool finishXml = false;
|
||||||
|
bool appendXml = false;
|
||||||
|
unsigned char* finalImagep;
|
||||||
|
unsigned int i, channels, ftime;
|
||||||
|
string s, flameName, filename;
|
||||||
|
ostringstream os;
|
||||||
|
vector<unsigned char> finalImage, vecRgb;
|
||||||
|
vector<Ember<T>> embers;
|
||||||
|
EmberStats stats;
|
||||||
|
EmberReport emberReport;
|
||||||
|
EmberImageComments comments;
|
||||||
|
Ember<T> centerEmber;
|
||||||
|
XmlToEmber<T> parser;
|
||||||
|
EmberToXml<T> emberToXml;
|
||||||
|
auto_ptr<RenderProgress<T>> progress(new RenderProgress<T>());
|
||||||
|
auto_ptr<Renderer<T, bucketT>> renderer(CreateRenderer<T, bucketT>(opt.EmberCL() ? OPENCL_RENDERER : CPU_RENDERER, opt.Platform(), opt.Device(), false, 0, emberReport));
|
||||||
|
vector<string> errorReport = emberReport.ErrorReport();
|
||||||
|
|
||||||
|
if (!errorReport.empty())
|
||||||
|
emberReport.DumpErrorReport();
|
||||||
|
|
||||||
|
if (!renderer.get())
|
||||||
|
{
|
||||||
|
cout << "Renderer creation failed, exiting." << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.EmberCL() && renderer->RendererType() != OPENCL_RENDERER)//OpenCL init failed, so fall back to CPU.
|
||||||
|
opt.EmberCL(false);
|
||||||
|
|
||||||
|
if (!InitPaletteList<T>(opt.PalettePath()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!ParseEmberFile(parser, opt.Input(), embers))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!opt.EmberCL())
|
||||||
|
{
|
||||||
|
if (opt.ThreadCount() == 0)
|
||||||
|
{
|
||||||
|
cout << "Using " << Timing::ProcessorCount() << " automatically detected threads." << endl;
|
||||||
|
opt.ThreadCount(Timing::ProcessorCount());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cout << "Using " << opt.ThreadCount() << " manually specified threads." << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
renderer->ThreadCount(opt.ThreadCount(), opt.IsaacSeed() != "" ? opt.IsaacSeed().c_str() : NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cout << "Using OpenCL to render." << endl;
|
||||||
|
|
||||||
|
if (opt.Verbose())
|
||||||
|
{
|
||||||
|
cout << "Platform: " << wrapper.PlatformName(opt.Platform()) << endl;
|
||||||
|
cout << "Device: " << wrapper.DeviceName(opt.Platform(), opt.Device()) << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.ThreadCount() > 1)
|
||||||
|
cout << "Cannot specify threads with OpenCL, using 1 thread." << endl;
|
||||||
|
|
||||||
|
opt.ThreadCount(1);
|
||||||
|
renderer->ThreadCount(opt.ThreadCount(), opt.IsaacSeed() != "" ? opt.IsaacSeed().c_str() : NULL);
|
||||||
|
|
||||||
|
if (opt.BitsPerChannel() != 8)
|
||||||
|
{
|
||||||
|
cout << "Bits per channel cannot be anything other than 8 with OpenCL, setting to 8." << endl;
|
||||||
|
opt.BitsPerChannel(8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.Format() != "jpg" &&
|
||||||
|
opt.Format() != "png" &&
|
||||||
|
opt.Format() != "ppm" &&
|
||||||
|
opt.Format() != "bmp")
|
||||||
|
{
|
||||||
|
cout << "Format must be jpg, png, ppm, or bmp not " << opt.Format() << ". Setting to jpg." << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
channels = opt.Format() == "png" ? 4 : 3;
|
||||||
|
|
||||||
|
if (opt.BitsPerChannel() == 16 && opt.Format() != "png")
|
||||||
|
{
|
||||||
|
cout << "Support for 16 bits per channel images is only present for the png format. Setting to 8." << endl;
|
||||||
|
opt.BitsPerChannel(8);
|
||||||
|
}
|
||||||
|
else if (opt.BitsPerChannel() != 8 && opt.BitsPerChannel() != 16)
|
||||||
|
{
|
||||||
|
cout << "Unexpected bits per channel specified " << opt.BitsPerChannel() << ". Setting to 8." << endl;
|
||||||
|
opt.BitsPerChannel(8);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.InsertPalette() && opt.BitsPerChannel() != 8)
|
||||||
|
{
|
||||||
|
cout << "Inserting palette only supported with 8 bits per channel, insertion will not take place." << endl;
|
||||||
|
opt.InsertPalette(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.AspectRatio() < 0)
|
||||||
|
{
|
||||||
|
cout << "Invalid pixel aspect ratio " << opt.AspectRatio() << endl << ". Must be positive, setting to 1." << endl;
|
||||||
|
opt.AspectRatio(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.Dtime() < 1)
|
||||||
|
{
|
||||||
|
cout << "Warning: dtime must be positive, not " << opt.Dtime() << ". Setting to 1." << endl;
|
||||||
|
opt.Dtime(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.Frame())
|
||||||
|
{
|
||||||
|
if (opt.Time())
|
||||||
|
{
|
||||||
|
cout << "Cannot specify both time and frame." << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.FirstFrame() || opt.LastFrame())
|
||||||
|
{
|
||||||
|
cout << "Cannot specify both frame and begin or end." << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
opt.FirstFrame(opt.Frame());
|
||||||
|
opt.LastFrame(opt.Frame());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.Time())
|
||||||
|
{
|
||||||
|
if (opt.FirstFrame() || opt.LastFrame())
|
||||||
|
{
|
||||||
|
cout << "Cannot specify both time and begin or end." << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
opt.FirstFrame(opt.Time());
|
||||||
|
opt.LastFrame(opt.Time());
|
||||||
|
}
|
||||||
|
|
||||||
|
//Prep all embers, by ensuring they:
|
||||||
|
//-Are sorted by time.
|
||||||
|
//-Do not have a dimension of 0.
|
||||||
|
//-Do not have a memory requirement greater than max uint.
|
||||||
|
//-Have quality and size scales applied, if present.
|
||||||
|
//-Have equal dimensions.
|
||||||
|
for (i = 0; i < embers.size(); i++)
|
||||||
|
{
|
||||||
|
if (i > 0 && embers[i].m_Time <= embers[i - 1].m_Time)
|
||||||
|
unsorted = true;
|
||||||
|
|
||||||
|
embers[i].m_Quality *= T(opt.QualityScale());
|
||||||
|
embers[i].m_FinalRasW = (unsigned int)((T)embers[i].m_FinalRasW * opt.SizeScale());
|
||||||
|
embers[i].m_FinalRasH = (unsigned int)((T)embers[i].m_FinalRasH * opt.SizeScale());
|
||||||
|
embers[i].m_PixelsPerUnit *= T(opt.SizeScale());
|
||||||
|
|
||||||
|
//Cast to double in case the value exceeds 2^32.
|
||||||
|
double imageMem = (double)channels * (double)embers[i].m_FinalRasW
|
||||||
|
* (double)embers[i].m_FinalRasH * (double)renderer->BytesPerChannel();
|
||||||
|
double maxMem = pow(2.0, double((sizeof(void*) * 8) - 1));
|
||||||
|
|
||||||
|
if (imageMem > maxMem)//Ensure the max amount of memory for a process isn't exceeded.
|
||||||
|
{
|
||||||
|
cout << "Image " << i << " size > " << maxMem << ". Setting to 1920 x 1080." << endl;
|
||||||
|
embers[i].m_FinalRasW = 1920;
|
||||||
|
embers[i].m_FinalRasH = 1080;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (embers[i].m_FinalRasW == 0 || embers[i].m_FinalRasH == 0)
|
||||||
|
{
|
||||||
|
cout << "Warning: Output image " << i << " has dimension 0: " << embers[i].m_FinalRasW << ", " << embers[i].m_FinalRasH << ". Setting to 1920 x 1080." << endl;
|
||||||
|
embers[i].m_FinalRasW = 1920;
|
||||||
|
embers[i].m_FinalRasH = 1080;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((embers[i].m_FinalRasW != embers[0].m_FinalRasW) ||
|
||||||
|
(embers[i].m_FinalRasH != embers[0].m_FinalRasH))
|
||||||
|
{
|
||||||
|
cout << "Warning: flame " << i << " at time " << embers[i].m_Time << " size mismatch. (" << embers[i].m_FinalRasW << ", " << embers[i].m_FinalRasH <<
|
||||||
|
") should be (" << embers[0].m_FinalRasW << ", " << embers[0].m_FinalRasH << "). Setting to " << embers[0].m_FinalRasW << ", " << embers[0].m_FinalRasH << "." << endl;
|
||||||
|
|
||||||
|
embers[i].m_FinalRasW = embers[0].m_FinalRasW;
|
||||||
|
embers[i].m_FinalRasH = embers[0].m_FinalRasH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unsorted)
|
||||||
|
{
|
||||||
|
cout << "Embers were unsorted by time. First out of order index was " << i << ". Sorting." << endl;
|
||||||
|
std::sort(embers.begin(), embers.end(), &CompareEmbers<T>);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!opt.Time() && !opt.Frame())
|
||||||
|
{
|
||||||
|
if (opt.FirstFrame() == UINT_MAX)
|
||||||
|
opt.FirstFrame((int)embers[0].m_Time);
|
||||||
|
|
||||||
|
if (opt.LastFrame() == UINT_MAX)
|
||||||
|
opt.LastFrame(ClampGte<unsigned int>((unsigned int)embers.back().m_Time - 1, opt.FirstFrame()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!opt.Out().empty())
|
||||||
|
{
|
||||||
|
appendXml = true;
|
||||||
|
filename = opt.Out();
|
||||||
|
cout << "Single output file " << opt.Out() << " specified for multiple images. They will be all overwritten and only the last image will remain." << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Final setup steps before running.
|
||||||
|
os.imbue(std::locale(""));
|
||||||
|
renderer->SetEmber(embers);
|
||||||
|
renderer->EarlyClip(opt.EarlyClip());
|
||||||
|
renderer->LockAccum(opt.LockAccum());
|
||||||
|
renderer->InsertPalette(opt.InsertPalette());
|
||||||
|
renderer->SubBatchSize(opt.SubBatchSize());
|
||||||
|
renderer->PixelAspectRatio(T(opt.AspectRatio()));
|
||||||
|
renderer->Transparency(opt.Transparency());
|
||||||
|
renderer->NumChannels(channels);
|
||||||
|
renderer->BytesPerChannel(opt.BitsPerChannel() / 8);
|
||||||
|
renderer->Callback(opt.DoProgress() ? progress.get() : NULL);
|
||||||
|
|
||||||
|
//Begin run.
|
||||||
|
for (ftime = opt.FirstFrame(); ftime <= opt.LastFrame(); ftime += opt.Dtime())
|
||||||
|
{
|
||||||
|
T localTime = T(ftime);
|
||||||
|
|
||||||
|
if ((opt.LastFrame() - opt.FirstFrame()) / opt.Dtime() >= 1)
|
||||||
|
VerbosePrint("Time = " << ftime << " / " << opt.LastFrame() << " / " << opt.Dtime());
|
||||||
|
|
||||||
|
renderer->Reset();
|
||||||
|
|
||||||
|
if ((renderer->Run(finalImage, localTime) != RENDER_OK) || renderer->Aborted() || finalImage.empty())
|
||||||
|
{
|
||||||
|
cout << "Error: image rendering failed, skipping to next image." << endl;
|
||||||
|
renderer->DumpErrorReport();//Something went wrong, print errors.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.Out().empty())
|
||||||
|
{
|
||||||
|
os.str("");
|
||||||
|
os << opt.Prefix() << setfill('0') << setw(5) << ftime << opt.Suffix() << "." << opt.Format();
|
||||||
|
filename = os.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.WriteGenome())
|
||||||
|
{
|
||||||
|
flameName = filename.substr(0, filename.find_last_of('.')) + ".flam3";
|
||||||
|
VerbosePrint("Writing " + flameName);
|
||||||
|
Interpolater<T>::Interpolate(embers, localTime, 0, centerEmber);//Get center flame.
|
||||||
|
|
||||||
|
if (appendXml)
|
||||||
|
{
|
||||||
|
startXml = ftime == opt.FirstFrame();
|
||||||
|
finishXml = ftime == opt.LastFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
emberToXml.Save(flameName, centerEmber, opt.PrintEditDepth(), true, opt.IntPalette(), opt.HexPalette(), true, startXml, finishXml);
|
||||||
|
}
|
||||||
|
|
||||||
|
writeSuccess = false;
|
||||||
|
comments = renderer->ImageComments(opt.PrintEditDepth(), opt.IntPalette(), opt.HexPalette());
|
||||||
|
stats = renderer->Stats();
|
||||||
|
os.str("");
|
||||||
|
os << comments.m_NumIters << "/" << renderer->TotalIterCount() << " (" << std::fixed << std::setprecision(2) << ((double)stats.m_Iters/(double)renderer->TotalIterCount() * 100) << "%)";
|
||||||
|
|
||||||
|
VerbosePrint("\nIters ran/requested: " + os.str());
|
||||||
|
VerbosePrint("Bad values: " << stats.m_Badvals);
|
||||||
|
VerbosePrint("Render time: " + t.Format(stats.m_RenderSeconds * 1000));
|
||||||
|
VerbosePrint("Writing " + filename);
|
||||||
|
|
||||||
|
if ((opt.Format() == "jpg" || opt.Format() == "bmp") && renderer->NumChannels() == 4)
|
||||||
|
{
|
||||||
|
EmberNs::RgbaToRgb(finalImage, vecRgb, renderer->FinalRasW(), renderer->FinalRasH());
|
||||||
|
|
||||||
|
finalImagep = vecRgb.data();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
finalImagep = finalImage.data();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.Format() == "png")
|
||||||
|
writeSuccess = WritePng(filename.c_str(), finalImagep, renderer->FinalRasW(), renderer->FinalRasH(), opt.BitsPerChannel() / 8, opt.PngComments(), comments, opt.Id(), opt.Url(), opt.Nick());
|
||||||
|
else if (opt.Format() == "jpg")
|
||||||
|
writeSuccess = WriteJpeg(filename.c_str(), finalImagep, renderer->FinalRasW(), renderer->FinalRasH(), opt.JpegQuality(), opt.JpegComments(), comments, opt.Id(), opt.Url(), opt.Nick());
|
||||||
|
else if (opt.Format() == "ppm")
|
||||||
|
writeSuccess = WritePpm(filename.c_str(), finalImagep, renderer->FinalRasW(), renderer->FinalRasH());
|
||||||
|
else if (opt.Format() == "bmp")
|
||||||
|
writeSuccess = WriteBmp(filename.c_str(), finalImagep, renderer->FinalRasW(), renderer->FinalRasH());
|
||||||
|
|
||||||
|
if (!writeSuccess)
|
||||||
|
cout << "Error writing " << filename << endl;
|
||||||
|
|
||||||
|
centerEmber.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
VerbosePrint("Done.\n");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Main program entry point for EmberAnimate.exe.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="argc">The number of command line arguments passed</param>
|
||||||
|
/// <param name="argv">The command line arguments passed</param>
|
||||||
|
/// <returns>0 if successful, else 1.</returns>
|
||||||
|
int _tmain(int argc, _TCHAR* argv[])
|
||||||
|
{
|
||||||
|
bool b, d = true;
|
||||||
|
EmberOptions opt;
|
||||||
|
|
||||||
|
//Required for large allocs, else GPU memory usage will be severely limited to small sizes.
|
||||||
|
//This must be done in the application and not in the EmberCL DLL.
|
||||||
|
_putenv_s("GPU_MAX_ALLOC_PERCENT", "100");
|
||||||
|
|
||||||
|
if (opt.Populate(argc, argv, OPT_USE_ANIMATE))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
#ifdef DO_DOUBLE
|
||||||
|
if (opt.Bits() == 64)
|
||||||
|
{
|
||||||
|
b = EmberAnimate<double, double>(opt);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
if (opt.Bits() == 33)
|
||||||
|
{
|
||||||
|
b = EmberAnimate<float, float>(opt);
|
||||||
|
}
|
||||||
|
else if (opt.Bits() == 32)
|
||||||
|
{
|
||||||
|
cout << "Bits 32/int histogram no longer supported. Using bits == 33 (float)." << endl;
|
||||||
|
b = EmberAnimate<float, float>(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
return b ? 0 : 1;
|
||||||
|
}
|
16
Source/EmberAnimate/EmberAnimate.h
Normal file
16
Source/EmberAnimate/EmberAnimate.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "EmberOptions.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Declaration for the EmberAnimate() function.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The core of the EmberAnimate.exe program.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="opt">A populated EmberOptions object which specifies all program options to be used</param>
|
||||||
|
/// <returns>True if success, else false.</returns>
|
||||||
|
template <typename T, typename bucketT>
|
||||||
|
static bool EmberAnimate(EmberOptions& opt);
|
98
Source/EmberAnimate/EmberAnimate.rc
Normal file
98
Source/EmberAnimate/EmberAnimate.rc
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
// Microsoft Visual C++ generated resource script.
|
||||||
|
//
|
||||||
|
#include <windows.h>
|
||||||
|
#include "resource.h"
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// English (United States) resources
|
||||||
|
|
||||||
|
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||||
|
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
|
#pragma code_page(1252)
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Icon
|
||||||
|
//
|
||||||
|
|
||||||
|
// Icon with lowest ID value placed first to ensure application icon
|
||||||
|
// remains consistent on all systems.
|
||||||
|
IDI_ICON1 ICON "..\\Fractorium\\Icons\\\\Fractorium.ico"
|
||||||
|
|
||||||
|
#ifdef APSTUDIO_INVOKED
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// TEXTINCLUDE
|
||||||
|
//
|
||||||
|
|
||||||
|
1 TEXTINCLUDE
|
||||||
|
BEGIN
|
||||||
|
"resource.h\0"
|
||||||
|
END
|
||||||
|
|
||||||
|
2 TEXTINCLUDE
|
||||||
|
BEGIN
|
||||||
|
"\0"
|
||||||
|
END
|
||||||
|
|
||||||
|
3 TEXTINCLUDE
|
||||||
|
BEGIN
|
||||||
|
"\r\n"
|
||||||
|
"\0"
|
||||||
|
END
|
||||||
|
|
||||||
|
#endif // APSTUDIO_INVOKED
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Version
|
||||||
|
//
|
||||||
|
|
||||||
|
VS_VERSION_INFO VERSIONINFO
|
||||||
|
FILEVERSION 0,4,0,2
|
||||||
|
PRODUCTVERSION 0,4,0,2
|
||||||
|
FILEFLAGSMASK 0x3fL
|
||||||
|
#ifdef _DEBUG
|
||||||
|
FILEFLAGS 0x1L
|
||||||
|
#else
|
||||||
|
FILEFLAGS 0x0L
|
||||||
|
#endif
|
||||||
|
FILEOS 0x40004L
|
||||||
|
FILETYPE 0x0L
|
||||||
|
FILESUBTYPE 0x0L
|
||||||
|
BEGIN
|
||||||
|
BLOCK "StringFileInfo"
|
||||||
|
BEGIN
|
||||||
|
BLOCK "040904b0"
|
||||||
|
BEGIN
|
||||||
|
VALUE "CompanyName", "Open Source"
|
||||||
|
VALUE "FileDescription", "Renders fractal flames as animations with motion blur"
|
||||||
|
VALUE "FileVersion", "0.4.0.2"
|
||||||
|
VALUE "InternalName", "EmberAnimate.rc"
|
||||||
|
VALUE "LegalCopyright", "Copyright (C) Matt Feemster 2013, GPL v3"
|
||||||
|
VALUE "OriginalFilename", "EmberAnimate.rc"
|
||||||
|
VALUE "ProductName", "Ember Animate"
|
||||||
|
VALUE "ProductVersion", "0.4.0.2"
|
||||||
|
END
|
||||||
|
END
|
||||||
|
BLOCK "VarFileInfo"
|
||||||
|
BEGIN
|
||||||
|
VALUE "Translation", 0x409, 1200
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
#endif // English (United States) resources
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef APSTUDIO_INVOKED
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Generated from the TEXTINCLUDE 3 resource.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
#endif // not APSTUDIO_INVOKED
|
||||||
|
|
15
Source/EmberAnimate/resource.h
Normal file
15
Source/EmberAnimate/resource.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
//{{NO_DEPENDENCIES}}
|
||||||
|
// Microsoft Visual C++ generated include file.
|
||||||
|
// Used by EmberAnimate.rc
|
||||||
|
//
|
||||||
|
|
||||||
|
// Next default values for new objects
|
||||||
|
//
|
||||||
|
#ifdef APSTUDIO_INVOKED
|
||||||
|
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||||
|
#define _APS_NEXT_RESOURCE_VALUE 101
|
||||||
|
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||||
|
#define _APS_NEXT_CONTROL_VALUE 1000
|
||||||
|
#define _APS_NEXT_SYMED_VALUE 101
|
||||||
|
#endif
|
||||||
|
#endif
|
698
Source/EmberCL/DEOpenCLKernelCreator.cpp
Normal file
698
Source/EmberCL/DEOpenCLKernelCreator.cpp
Normal file
@ -0,0 +1,698 @@
|
|||||||
|
#include "EmberCLPch.h"
|
||||||
|
#include "DEOpenCLKernelCreator.h"
|
||||||
|
|
||||||
|
namespace EmberCLns
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Empty constructor that does nothing. The user must call the one which takes a bool
|
||||||
|
/// argument before using this class.
|
||||||
|
/// This constructor only exists so the class can be a member of a class.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
DEOpenCLKernelCreator<T>::DEOpenCLKernelCreator()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor for float template type that sets all kernel entry points as well as composes
|
||||||
|
/// all kernel source strings.
|
||||||
|
/// No program compilation is done here, the user must explicitly do it.
|
||||||
|
/// The caller must specify whether they are using an nVidia or AMD card because it changes
|
||||||
|
/// the amount of local memory available.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="nVidia">True if running on an nVidia card, else false.</param>
|
||||||
|
template <>
|
||||||
|
DEOpenCLKernelCreator<float>::DEOpenCLKernelCreator(bool nVidia)
|
||||||
|
{
|
||||||
|
m_NVidia = nVidia;
|
||||||
|
m_LogScaleSumDEEntryPoint = "LogScaleSumDensityFilterKernel";
|
||||||
|
m_LogScaleAssignDEEntryPoint = "LogScaleAssignDensityFilterKernel";
|
||||||
|
m_GaussianDEWithoutSsEntryPoint = "GaussianDEWithoutSsKernel";
|
||||||
|
m_GaussianDESsWithScfEntryPoint = "GaussianDESsWithScfKernel";
|
||||||
|
m_GaussianDESsWithoutScfEntryPoint = "GaussianDESsWithoutScfKernel";
|
||||||
|
m_GaussianDEWithoutSsNoCacheEntryPoint = "GaussianDEWithoutSsNoCacheKernel";
|
||||||
|
m_GaussianDESsWithScfNoCacheEntryPoint = "GaussianDESsWithScfNoCacheKernel";
|
||||||
|
m_GaussianDESsWithoutScfNoCacheEntryPoint = "GaussianDESsWithoutScfNoCacheKernel";
|
||||||
|
m_LogScaleSumDEKernel = CreateLogScaleSumDEKernelString();
|
||||||
|
m_LogScaleAssignDEKernel = CreateLogScaleAssignDEKernelString();
|
||||||
|
m_GaussianDEWithoutSsKernel = CreateGaussianDEKernel(1);
|
||||||
|
m_GaussianDESsWithScfKernel = CreateGaussianDEKernel(2);
|
||||||
|
m_GaussianDESsWithoutScfKernel = CreateGaussianDEKernel(3);
|
||||||
|
m_GaussianDEWithoutSsNoCacheKernel = CreateGaussianDEKernelNoLocalCache(1);
|
||||||
|
m_GaussianDESsWithScfNoCacheKernel = CreateGaussianDEKernelNoLocalCache(2);
|
||||||
|
m_GaussianDESsWithoutScfNoCacheKernel = CreateGaussianDEKernelNoLocalCache(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor for double template type that sets all kernel entry points as well as composes
|
||||||
|
/// all kernel source strings.
|
||||||
|
/// Note that no versions of kernels that use the cache are compiled because
|
||||||
|
/// the cache is not big enough to hold double4.
|
||||||
|
/// No program compilation is done here, the user must explicitly do it.
|
||||||
|
/// Specifying true or false for the bool parameter has no effect since no local memory
|
||||||
|
/// is used when instantiated with type double.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="nVidia">True if running on an nVidia card, else false. Ignored.</param>
|
||||||
|
template <>
|
||||||
|
DEOpenCLKernelCreator<double>::DEOpenCLKernelCreator(bool nVidia)
|
||||||
|
{
|
||||||
|
m_NVidia = nVidia;
|
||||||
|
m_LogScaleSumDEEntryPoint = "LogScaleSumDensityFilterKernel";
|
||||||
|
m_LogScaleAssignDEEntryPoint = "LogScaleAssignDensityFilterKernel";
|
||||||
|
m_GaussianDEWithoutSsNoCacheEntryPoint = "GaussianDEWithoutSsNoCacheKernel";
|
||||||
|
m_GaussianDESsWithScfNoCacheEntryPoint = "GaussianDESsWithScfNoCacheKernel";
|
||||||
|
m_GaussianDESsWithoutScfNoCacheEntryPoint = "GaussianDESsWithoutScfNoCacheKernel";
|
||||||
|
m_LogScaleSumDEKernel = CreateLogScaleSumDEKernelString();
|
||||||
|
m_LogScaleAssignDEKernel = CreateLogScaleAssignDEKernelString();
|
||||||
|
m_GaussianDEWithoutSsNoCacheKernel = CreateGaussianDEKernelNoLocalCache(1);
|
||||||
|
m_GaussianDESsWithScfNoCacheKernel = CreateGaussianDEKernelNoLocalCache(2);
|
||||||
|
m_GaussianDESsWithoutScfNoCacheKernel = CreateGaussianDEKernelNoLocalCache(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Kernel source and entry point properties, getters only.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
template <typename T> string DEOpenCLKernelCreator<T>::LogScaleSumDEKernel() { return m_LogScaleSumDEKernel; }
|
||||||
|
template <typename T> string DEOpenCLKernelCreator<T>::LogScaleSumDEEntryPoint() { return m_LogScaleSumDEEntryPoint; }
|
||||||
|
template <typename T> string DEOpenCLKernelCreator<T>::LogScaleAssignDEKernel() { return m_LogScaleAssignDEKernel; }
|
||||||
|
template <typename T> string DEOpenCLKernelCreator<T>::LogScaleAssignDEEntryPoint() { return m_LogScaleAssignDEEntryPoint; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the kernel source for the specified supersample and filterWidth.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ss">The supersample being used</param>
|
||||||
|
/// <param name="filterWidth">Filter width</param>
|
||||||
|
/// <returns>The kernel source</returns>
|
||||||
|
template <typename T>
|
||||||
|
string DEOpenCLKernelCreator<T>::GaussianDEKernel(unsigned int ss, unsigned int filterWidth)
|
||||||
|
{
|
||||||
|
if ((typeid(T) == typeid(double)) || (filterWidth > MaxDEFilterSize()))//Type double does not use cache.
|
||||||
|
{
|
||||||
|
if (ss > 1)
|
||||||
|
{
|
||||||
|
if (!(ss & 1))
|
||||||
|
return m_GaussianDESsWithScfNoCacheKernel;
|
||||||
|
else
|
||||||
|
return m_GaussianDESsWithoutScfNoCacheKernel;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return m_GaussianDEWithoutSsNoCacheKernel;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (ss > 1)
|
||||||
|
{
|
||||||
|
if (!(ss & 1))
|
||||||
|
return m_GaussianDESsWithScfKernel;
|
||||||
|
else
|
||||||
|
return m_GaussianDESsWithoutScfKernel;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return m_GaussianDEWithoutSsKernel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the kernel entry point for the specified supersample and filterWidth.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ss">The supersample being used</param>
|
||||||
|
/// <param name="filterWidth">Filter width</param>
|
||||||
|
/// <returns>The name of the density estimation filtering entry point kernel function</returns>
|
||||||
|
template <typename T>
|
||||||
|
string DEOpenCLKernelCreator<T>::GaussianDEEntryPoint(unsigned int ss, unsigned int filterWidth)
|
||||||
|
{
|
||||||
|
if ((typeid(T) == typeid(double)) || (filterWidth > MaxDEFilterSize()))//Type double does not use cache.
|
||||||
|
{
|
||||||
|
if (ss > 1)
|
||||||
|
{
|
||||||
|
if (!(ss & 1))
|
||||||
|
return m_GaussianDESsWithScfNoCacheEntryPoint;
|
||||||
|
else
|
||||||
|
return m_GaussianDESsWithoutScfNoCacheEntryPoint;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return m_GaussianDEWithoutSsNoCacheEntryPoint;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (ss > 1)
|
||||||
|
{
|
||||||
|
if (!(ss & 1))
|
||||||
|
return m_GaussianDESsWithScfEntryPoint;
|
||||||
|
else
|
||||||
|
return m_GaussianDESsWithoutScfEntryPoint;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return m_GaussianDEWithoutSsEntryPoint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the maximum filter size allowed for running the local memory version of density filtering
|
||||||
|
/// Filters larger than this value will run the version without local memory caching.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The maximum filter size allowed for running the local memory version of density filtering</returns>
|
||||||
|
template <typename T>
|
||||||
|
unsigned int DEOpenCLKernelCreator<T>::MaxDEFilterSize() { return 9; }//The true max would be (maxBoxSize - 1) / 2, but that's impractical because it can give us a tiny block size.
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Solve for the maximum filter radius.
|
||||||
|
/// The final filter width is calculated by: (unsigned int)(ceil(m_MaxRad) * (T)m_Supersample) + (m_Supersample - 1);
|
||||||
|
/// Must solve for what max rad should be in order to give a maximum final width of (maxBoxSize - 1) / 2, assuming
|
||||||
|
/// a minimum block size of 1 which processes 1 pixel.
|
||||||
|
/// Example: If a box size of 20 was allowed, a filter
|
||||||
|
/// size of up to 9: (20 - 1) / 2 == (19 / 2) == 9 could be supported.
|
||||||
|
/// This function is deprecated, the appropriate kernels take care of this problem now.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="maxBoxSize">Maximum size of the box.</param>
|
||||||
|
/// <param name="desiredFilterSize">Size of the desired filter.</param>
|
||||||
|
/// <param name="ss">The supersample being used</param>
|
||||||
|
/// <returns>The maximum filter radius allowed</returns>
|
||||||
|
template <typename T>
|
||||||
|
T DEOpenCLKernelCreator<T>::SolveMaxDERad(unsigned int maxBoxSize, T desiredFilterSize, T ss)
|
||||||
|
{
|
||||||
|
unsigned int finalFilterSize = (unsigned int)((ceil(desiredFilterSize) * ss) + (ss - 1.0));
|
||||||
|
|
||||||
|
//Return the desired size if the final size of it will fit.
|
||||||
|
if (finalFilterSize <= MaxDEFilterSize())
|
||||||
|
return desiredFilterSize;
|
||||||
|
|
||||||
|
//The final size doesn't fit, so scale the original down until it fits.
|
||||||
|
return (T)floor((MaxDEFilterSize() - (ss - 1.0)) / ss);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determine the maximum filter box size based on the amount of local memory available
|
||||||
|
/// to each block.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="localMem">The local memory available to a block</param>
|
||||||
|
/// <returns>The maximum filter box size allowed</returns>
|
||||||
|
template <typename T>
|
||||||
|
unsigned int DEOpenCLKernelCreator<T>::SolveMaxBoxSize(unsigned int localMem)
|
||||||
|
{
|
||||||
|
return (unsigned int)floor(sqrt(floor((T)localMem / 16.0)));//Divide by 16 because each element is float4.
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create the log scale kernel string, using summation.
|
||||||
|
/// This means each cell will be added to, rather than just assigned.
|
||||||
|
/// Since adding is slower than assigning, this should only be used when Passes > 1,
|
||||||
|
/// otherwise use the kernel created from CreateLogScaleAssignDEKernelString().
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The kernel string</returns>
|
||||||
|
template <typename T>
|
||||||
|
string DEOpenCLKernelCreator<T>::CreateLogScaleSumDEKernelString()
|
||||||
|
{
|
||||||
|
ostringstream os;
|
||||||
|
|
||||||
|
os <<
|
||||||
|
ConstantDefinesString(typeid(T) == typeid(double)) <<
|
||||||
|
DensityFilterCLStructString <<
|
||||||
|
"__kernel void " << m_LogScaleSumDEEntryPoint << "(\n"
|
||||||
|
" const __global real4* histogram,\n"
|
||||||
|
" __global real4* accumulator,\n"
|
||||||
|
" __constant DensityFilterCL* logFilter\n"
|
||||||
|
"\t)\n"
|
||||||
|
"{\n"
|
||||||
|
" if ((GLOBAL_ID_X < logFilter->m_SuperRasW) && (GLOBAL_ID_Y < logFilter->m_SuperRasH))\n"
|
||||||
|
" {\n"
|
||||||
|
" uint index = (GLOBAL_ID_Y * logFilter->m_SuperRasW) + GLOBAL_ID_X;\n"
|
||||||
|
"\n"
|
||||||
|
" if (histogram[index].w != 0)\n"
|
||||||
|
" {\n"
|
||||||
|
" real_t logScale = (logFilter->m_K1 * log(1.0 + histogram[index].w * logFilter->m_K2)) / histogram[index].w;\n"
|
||||||
|
"\n"
|
||||||
|
" accumulator[index] += histogram[index] * logScale;\n"//Using a single real4 vector operation doubles the speed from doing each component individually.
|
||||||
|
" }\n"
|
||||||
|
"\n"
|
||||||
|
" barrier(CLK_GLOBAL_MEM_FENCE);\n"//Just to be safe. Makes no speed difference to do all of the time or only when there's a hit.
|
||||||
|
" }\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create the log scale kernel string, using assignment.
|
||||||
|
/// Use this when Passes == 1.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The kernel string</returns>
|
||||||
|
template <typename T>
|
||||||
|
string DEOpenCLKernelCreator<T>::CreateLogScaleAssignDEKernelString()
|
||||||
|
{
|
||||||
|
ostringstream os;
|
||||||
|
|
||||||
|
os <<
|
||||||
|
ConstantDefinesString(typeid(T) == typeid(double)) <<
|
||||||
|
DensityFilterCLStructString <<
|
||||||
|
"__kernel void " << m_LogScaleAssignDEEntryPoint << "(\n"
|
||||||
|
" const __global real4* histogram,\n"
|
||||||
|
" __global real4* accumulator,\n"
|
||||||
|
" __constant DensityFilterCL* logFilter\n"
|
||||||
|
"\t)\n"
|
||||||
|
"{\n"
|
||||||
|
" if ((GLOBAL_ID_X < logFilter->m_SuperRasW) && (GLOBAL_ID_Y < logFilter->m_SuperRasH))\n"
|
||||||
|
" {\n"
|
||||||
|
" uint index = (GLOBAL_ID_Y * logFilter->m_SuperRasW) + GLOBAL_ID_X;\n"
|
||||||
|
"\n"
|
||||||
|
" if (histogram[index].w != 0)\n"
|
||||||
|
" {\n"
|
||||||
|
" real_t logScale = (logFilter->m_K1 * log(1.0 + histogram[index].w * logFilter->m_K2)) / histogram[index].w;\n"
|
||||||
|
"\n"
|
||||||
|
" accumulator[index] = histogram[index] * logScale;\n"//Using a single real4 vector operation doubles the speed from doing each component individually.
|
||||||
|
" }\n"
|
||||||
|
"\n"
|
||||||
|
" barrier(CLK_GLOBAL_MEM_FENCE);\n"//Just to be safe. Makes no speed difference to do all of the time or only when there's a hit.
|
||||||
|
" }\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create the gaussian density filtering kernel string.
|
||||||
|
/// 6 different methods of processing were tried before settling on this final and fastest 7th one.
|
||||||
|
/// Each block processes a box and exits. No column or row advancements happen.
|
||||||
|
/// The block accumulates to a temporary box and writes the contents to the global density filter buffer when done.
|
||||||
|
/// Note this applies the filter from top to bottom row and not from the center outward like the CPU version does.
|
||||||
|
/// This allows the image to be filtered without suffering from pixel loss due to race conditions.
|
||||||
|
/// It is run in multiple passes that are spaced far enough apart on the image so as to not overlap.
|
||||||
|
/// This allows writing to the global buffer without ever overlapping or using atomics.
|
||||||
|
/// The supersample parameter will produce three different kernels.
|
||||||
|
/// SS = 1, SS > 1 && SS even, SS > 1 && SS odd.
|
||||||
|
/// The width of the kernl this runs in must be evenly divisible by 16 or else artifacts will occur.
|
||||||
|
/// Note that because this function uses so many variables and is so complex, OpenCL can easily run
|
||||||
|
/// out of resources in some cases. Certain variables had to be reused to condense the kernel footprint
|
||||||
|
/// down enough to be able to run a block size of 32x32.
|
||||||
|
/// For double precision, or for SS > 1, a size of 32x30 is used.
|
||||||
|
/// Box width = (BLOCK_SIZE_X + (fw * 2)).
|
||||||
|
/// Box height = (BLOCK_SIZE_Y + (fw * 2)).
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ss">The supersample being used</param>
|
||||||
|
/// <returns>The kernel string</returns>
|
||||||
|
template <typename T>
|
||||||
|
string DEOpenCLKernelCreator<T>::CreateGaussianDEKernel(unsigned int ss)
|
||||||
|
{
|
||||||
|
bool doSS = ss > 1;
|
||||||
|
bool doScf = !(ss & 1);
|
||||||
|
ostringstream os;
|
||||||
|
|
||||||
|
os <<
|
||||||
|
ConstantDefinesString(typeid(T) == typeid(double)) <<
|
||||||
|
DensityFilterCLStructString <<
|
||||||
|
UnionCLStructString <<
|
||||||
|
"__kernel void " << GaussianDEEntryPoint(ss, MaxDEFilterSize()) << "(\n" <<
|
||||||
|
" const __global real4* histogram,\n"
|
||||||
|
" __global real4reals* accumulator,\n"
|
||||||
|
" __constant DensityFilterCL* densityFilter,\n"
|
||||||
|
" const __global real_t* filterCoefs,\n"
|
||||||
|
" const __global real_t* filterWidths,\n"
|
||||||
|
" const __global uint* coefIndices,\n"
|
||||||
|
" const uint chunkSizeW,\n"
|
||||||
|
" const uint chunkSizeH,\n"
|
||||||
|
" const uint rowParity,\n"
|
||||||
|
" const uint colParity\n"
|
||||||
|
"\t)\n"
|
||||||
|
"{\n"
|
||||||
|
//Parity determines if this function should execute.
|
||||||
|
" if ((GLOBAL_ID_X >= densityFilter->m_SuperRasW) ||\n"
|
||||||
|
" (GLOBAL_ID_Y >= densityFilter->m_SuperRasH) ||\n"
|
||||||
|
" ((BLOCK_ID_X % chunkSizeW) != colParity) ||\n"
|
||||||
|
" ((BLOCK_ID_Y % chunkSizeH) != rowParity)) \n"
|
||||||
|
" return;\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
if (doSS)
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" uint ss = (uint)floor((real_t)densityFilter->m_Supersample / 2.0);\n"
|
||||||
|
" int densityBoxLeftX;\n"
|
||||||
|
" int densityBoxRightX;\n"
|
||||||
|
" int densityBoxTopY;\n"
|
||||||
|
" int densityBoxBottomY;\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
if (doScf)
|
||||||
|
os <<
|
||||||
|
" real_t scfact = pow(densityFilter->m_Supersample / (densityFilter->m_Supersample + 1.0), 2.0);\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
//Compute the size of the temporary box which is the block width + 2 * filter width x block height + 2 * filter width.
|
||||||
|
//Ideally the block width and height are both 32. However, the height might be smaller if there isn't enough memory.
|
||||||
|
os <<
|
||||||
|
" uint fullTempBoxWidth, fullTempBoxHeight;\n"
|
||||||
|
" uint leftBound, rightBound, topBound, botBound;\n"
|
||||||
|
" uint blockHistStartRow, blockHistEndRow, boxReadStartRow, boxReadEndRow;\n"
|
||||||
|
" uint blockHistStartCol, boxReadStartCol, boxReadEndCol;\n"
|
||||||
|
" uint accumWriteStartRow, accumWriteStartCol, colsToWrite;\n"
|
||||||
|
|
||||||
|
//If any of the variables above end up being made __local, init them here.
|
||||||
|
//At the moment, it's slower even though it's more memory efficient.
|
||||||
|
//" if (THREAD_ID_X == 0 && THREAD_ID_Y == 0)\n"
|
||||||
|
//" {\n"
|
||||||
|
//Init local vars here.
|
||||||
|
//" }\n"
|
||||||
|
//"\n"
|
||||||
|
//" barrier(CLK_LOCAL_MEM_FENCE);\n"
|
||||||
|
"\n"
|
||||||
|
" fullTempBoxWidth = BLOCK_SIZE_X + (densityFilter->m_FilterWidth * 2);\n"
|
||||||
|
" fullTempBoxHeight = BLOCK_SIZE_Y + (densityFilter->m_FilterWidth * 2);\n"
|
||||||
|
//Compute the bounds of the area to be sampled, which is just the ends minus the super sample minus 1.
|
||||||
|
" leftBound = densityFilter->m_Supersample - 1;\n"
|
||||||
|
" rightBound = densityFilter->m_SuperRasW - (densityFilter->m_Supersample - 1);\n"
|
||||||
|
" topBound = densityFilter->m_Supersample - 1;\n"
|
||||||
|
" botBound = densityFilter->m_SuperRasH - (densityFilter->m_Supersample - 1);\n"
|
||||||
|
"\n"
|
||||||
|
//Start and end values are the indices in the histogram read from
|
||||||
|
//and written to in the accumulator. They are not the indices for the local block of data.
|
||||||
|
//Before computing local offsets, compute the global offsets first to determine if any rows or cols fall outside of the bounds.
|
||||||
|
" blockHistStartRow = min(botBound, topBound + (BLOCK_ID_Y * BLOCK_SIZE_Y));\n"//The first histogram row this block will process.
|
||||||
|
" blockHistEndRow = min(botBound, blockHistStartRow + BLOCK_SIZE_Y);\n"//The last histogram row this block will process, clamped to the last row.
|
||||||
|
" boxReadStartRow = densityFilter->m_FilterWidth - min(densityFilter->m_FilterWidth, blockHistStartRow);\n"//The first row in the local box to read from when writing back to the final accumulator for this block.
|
||||||
|
" boxReadEndRow = densityFilter->m_FilterWidth + min(densityFilter->m_FilterWidth + BLOCK_SIZE_Y, densityFilter->m_SuperRasH - blockHistStartRow);\n"//The last row in the local box to read from when writing back to the final accumulator for this block.
|
||||||
|
" blockHistStartCol = min(rightBound, leftBound + (BLOCK_ID_X * BLOCK_SIZE_X));\n"//The first histogram column this block will process.
|
||||||
|
" boxReadStartCol = densityFilter->m_FilterWidth - min(densityFilter->m_FilterWidth, blockHistStartCol);\n"//The first box row this block will read from when copying to the accumulator.
|
||||||
|
" boxReadEndCol = densityFilter->m_FilterWidth + min(densityFilter->m_FilterWidth + BLOCK_SIZE_X, densityFilter->m_SuperRasW - blockHistStartCol);\n"//The last box row this block will read from when copying to the accumulator.
|
||||||
|
"\n"
|
||||||
|
//Last, the indices in the global accumulator that the local bounds will be writing to.
|
||||||
|
" accumWriteStartRow = blockHistStartRow - min(densityFilter->m_FilterWidth, blockHistStartRow);\n"//Will be fw - 0 except for boundary columns, it will be less.
|
||||||
|
" accumWriteStartCol = blockHistStartCol - min(densityFilter->m_FilterWidth, blockHistStartCol);\n"
|
||||||
|
" colsToWrite = ceil((real_t)(boxReadEndCol - boxReadStartCol) / (real_t)BLOCK_SIZE_X);\n"
|
||||||
|
"\n"
|
||||||
|
" uint threadHistRow = blockHistStartRow + THREAD_ID_Y;\n"//The histogram row this individual thread will be reading from.
|
||||||
|
" uint threadHistCol = blockHistStartCol + THREAD_ID_X;\n"//The histogram column this individual thread will be reading from.
|
||||||
|
"\n"
|
||||||
|
|
||||||
|
//Compute the center position in this local box to serve as the center position
|
||||||
|
//from which filter application offsets are computed.
|
||||||
|
//These are the local indices for the local data that are temporarily accumulated to before
|
||||||
|
//writing out to the global accumulator.
|
||||||
|
" uint boxRow = densityFilter->m_FilterWidth + THREAD_ID_Y;\n"
|
||||||
|
" uint boxCol = densityFilter->m_FilterWidth + THREAD_ID_X;\n"
|
||||||
|
" uint colElementsToZero = ceil((real_t)fullTempBoxWidth / (real_t)(BLOCK_SIZE_X));\n"//Usually is 2.
|
||||||
|
" int i, j, k;\n"
|
||||||
|
" uint filterSelectInt, filterCoefIndex;\n"
|
||||||
|
" real_t cacheLog;\n"
|
||||||
|
" real_t filterSelect;\n"
|
||||||
|
" real4 bucket;\n"
|
||||||
|
;
|
||||||
|
|
||||||
|
//This will be treated as having dimensions of (BLOCK_SIZE_X + (fw * 2)) x (BLOCK_SIZE_Y + (fw * 2)).
|
||||||
|
if (m_NVidia)
|
||||||
|
os << " __local real4reals filterBox[3000];\n";
|
||||||
|
else
|
||||||
|
os << " __local real4reals filterBox[1200];\n";
|
||||||
|
|
||||||
|
os <<
|
||||||
|
//Zero the temp buffers first. This splits the zeroization evenly across all threads (columns) in the first block row.
|
||||||
|
//This is a middle ground solution. Previous methods tried:
|
||||||
|
//Thread (0, 0) does all init. This works, but is the slowest.
|
||||||
|
//Init is divided among all threads. This is the fastest but exposes a severe flaw in OpenCL,
|
||||||
|
//in that it will not get executed by all threads before proceeding, despite the barrier statement
|
||||||
|
//below. As a result, strange artifacts will get left around because filtering gets executed on a temp
|
||||||
|
//box that has not been properly zeroized.
|
||||||
|
//The only way to do it and still achieve reasonable speed is to have the first row do it. This is
|
||||||
|
//most likely because the first row gets executed first, ensuring zeroization is done when the rest
|
||||||
|
//of the threads execute.
|
||||||
|
"\n"//Dummy test zeroization for debugging.
|
||||||
|
//" if (THREAD_ID_Y == 0 && THREAD_ID_X == 0)\n"//First thread of the block takes the responsibility of zeroizing.
|
||||||
|
//" {\n"
|
||||||
|
//" for (k = 0; k < 2 * 1024; k++)\n"
|
||||||
|
//" {\n"
|
||||||
|
//" filterBox[k].m_Real4 = 0;\n"
|
||||||
|
//" }\n"
|
||||||
|
//" }\n"
|
||||||
|
" if (THREAD_ID_Y == 0)\n"//First row of the block takes the responsibility of zeroizing.
|
||||||
|
" {\n"
|
||||||
|
" for (i = 0; i < fullTempBoxHeight; i++)\n"//Each column in the row iterates through all rows.
|
||||||
|
" {\n"
|
||||||
|
" for (j = 0; j < colElementsToZero && ((colElementsToZero * THREAD_ID_X) + j) < fullTempBoxWidth; j++)\n"//And zeroizes a few columns from that row.
|
||||||
|
" {\n"
|
||||||
|
" filterBox[(i * fullTempBoxWidth) + ((colElementsToZero * THREAD_ID_X) + j)].m_Real4 = 0;\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
"\n"
|
||||||
|
" barrier(CLK_LOCAL_MEM_FENCE);\n"
|
||||||
|
"\n"
|
||||||
|
" if (threadHistRow < botBound && threadHistCol < rightBound)\n"
|
||||||
|
" {\n"
|
||||||
|
" bucket = histogram[(threadHistRow * densityFilter->m_SuperRasW) + threadHistCol];\n"
|
||||||
|
"\n"
|
||||||
|
" if (bucket.w != 0)\n"
|
||||||
|
" {\n"
|
||||||
|
" cacheLog = (densityFilter->m_K1 * log(1.0 + bucket.w * densityFilter->m_K2)) / bucket.w;\n";
|
||||||
|
|
||||||
|
if (doSS)
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" filterSelect = 0;\n"
|
||||||
|
" densityBoxLeftX = threadHistCol - min(threadHistCol, ss);\n"
|
||||||
|
" densityBoxRightX = threadHistCol + min(ss, (densityFilter->m_SuperRasW - threadHistCol) - 1);\n"
|
||||||
|
" densityBoxTopY = threadHistRow - min(threadHistRow, ss);\n"
|
||||||
|
" densityBoxBottomY = threadHistRow + min(ss, (densityFilter->m_SuperRasH - threadHistRow) - 1);\n"
|
||||||
|
"\n"
|
||||||
|
" for (j = densityBoxTopY; j <= densityBoxBottomY; j++)\n"
|
||||||
|
" {\n"
|
||||||
|
" for (i = densityBoxLeftX; i <= densityBoxRightX; i++)\n"
|
||||||
|
" {\n"
|
||||||
|
" filterSelect += histogram[i + (j * densityFilter->m_SuperRasW)].w;\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
if (doScf)
|
||||||
|
os << " filterSelect *= scfact;\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
os
|
||||||
|
<< " filterSelect = bucket.w;\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
os <<
|
||||||
|
"\n"
|
||||||
|
" if (filterSelect > densityFilter->m_MaxFilteredCounts)\n"
|
||||||
|
" filterSelectInt = densityFilter->m_MaxFilterIndex;\n"
|
||||||
|
" else if (filterSelect <= DE_THRESH)\n"
|
||||||
|
" filterSelectInt = (int)ceil(filterSelect) - 1;\n"
|
||||||
|
" else\n"
|
||||||
|
" filterSelectInt = (int)DE_THRESH + (int)floor(pow((real_t)(filterSelect - DE_THRESH), densityFilter->m_Curve));\n"
|
||||||
|
"\n"
|
||||||
|
" if (filterSelectInt > densityFilter->m_MaxFilterIndex)\n"
|
||||||
|
" filterSelectInt = densityFilter->m_MaxFilterIndex;\n"
|
||||||
|
"\n"
|
||||||
|
" filterCoefIndex = filterSelectInt * densityFilter->m_KernelSize;\n"
|
||||||
|
"\n"
|
||||||
|
//With this new method, only accumulate to the temp local buffer first. Write to the final accumulator last.
|
||||||
|
//For each loop through, note that there is a local memory barrier call inside of each call to AddToAccumNoCheck().
|
||||||
|
//If this isn't done, pixel errors occurr and even an out of resources error occurrs because too many writes are done to the same place in memory at once.
|
||||||
|
" k = (int)densityFilter->m_FilterWidth;\n"//Need a signed int to use below, really is filter width, but reusing a variable to save space.
|
||||||
|
"\n"
|
||||||
|
" for (j = -k; j <= k; j++)\n"
|
||||||
|
" {\n"
|
||||||
|
" for (i = -k; i <= k; i++)\n"
|
||||||
|
" {\n"
|
||||||
|
" filterSelectInt = filterCoefIndex + coefIndices[(abs(j) * (densityFilter->m_FilterWidth + 1)) + abs(i)];\n"//Really is filterCoeffIndexPlusOffset, but reusing a variable to save space.
|
||||||
|
"\n"
|
||||||
|
" if (filterCoefs[filterSelectInt] != 0)\n"
|
||||||
|
" {\n"
|
||||||
|
" filterBox[(i + boxCol) + ((j + boxRow) * fullTempBoxWidth)].m_Real4 += (bucket * (filterCoefs[filterSelectInt] * cacheLog));\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
" barrier(CLK_LOCAL_MEM_FENCE);\n"//If this is the only barrier and the block size is exactly 16, it works perfectly. Otherwise, no chunks occur, but a many streaks.
|
||||||
|
" }\n"
|
||||||
|
" }\n"//bucket.w != 0.
|
||||||
|
" }\n"//In bounds.
|
||||||
|
"\n"
|
||||||
|
"\n"
|
||||||
|
" barrier(CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE);\n"
|
||||||
|
"\n"
|
||||||
|
" if (THREAD_ID_Y == 0)\n"
|
||||||
|
" {\n"
|
||||||
|
//At this point, all threads in this block have applied the filter to their surrounding pixel and stored the results in the temp local box.
|
||||||
|
//Add the cells of it that are in bounds to the global accumulator.
|
||||||
|
//Compute offsets in local box to read from, and offsets into global accumulator to write to.
|
||||||
|
//Use a method here that is similar to the zeroization above: Each thread (column) in the first row iterates through all of the
|
||||||
|
//rows and adds a few columns to the accumulator.
|
||||||
|
" for (i = boxReadStartRow, j = accumWriteStartRow; i < boxReadEndRow; i++, j++)\n"
|
||||||
|
" {\n"
|
||||||
|
" for (k = 0; k < colsToWrite; k++)\n"//Write a few columns.
|
||||||
|
" {\n"
|
||||||
|
" boxCol = (colsToWrite * THREAD_ID_X) + k;\n"//Really is colOffset, but reusing a variable to save space.
|
||||||
|
"\n"
|
||||||
|
" if (boxReadStartCol + boxCol < boxReadEndCol)\n"
|
||||||
|
" accumulator[(j * densityFilter->m_SuperRasW) + (accumWriteStartCol + boxCol)].m_Real4 += filterBox[(i * fullTempBoxWidth) + (boxReadStartCol + boxCol)].m_Real4;\n"
|
||||||
|
" }\n"
|
||||||
|
" barrier(CLK_GLOBAL_MEM_FENCE);\n"//This must be here or else chunks will go missing.
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create the gaussian density filtering kernel string, but use no local cache and perform
|
||||||
|
/// all writes directly to the global density filtering buffer.
|
||||||
|
/// Note this applies the filter from top to bottom row and not from the center outward like the CPU version does.
|
||||||
|
/// This allows the image to be filtered without suffering from pixel loss due to race conditions.
|
||||||
|
/// This is used for when the filter box is greater than can fit in the local cache.
|
||||||
|
/// While the cached version is incredibly fast, this version offers no real gain over doing it
|
||||||
|
/// on the CPU because the frequent global memory access brings performance to a crawl.
|
||||||
|
/// The supersample parameter will produce three different kernels.
|
||||||
|
/// SS = 1, SS > 1 && SS even, SS > 1 && SS odd.
|
||||||
|
/// The width of the kernl this runs in must be evenly divisible by 16 or else artifacts will occur.
|
||||||
|
/// Note that because this function uses so many variables and is so complex, OpenCL can easily run
|
||||||
|
/// out of resources in some cases. Certain variables had to be reused to condense the kernel footprint
|
||||||
|
/// down enough to be able to run a block size of 32x32.
|
||||||
|
/// For double precision, or for SS > 1, a size of 32x30 is used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ss">The supersample being used</param>
|
||||||
|
/// <returns>The kernel string</returns>
|
||||||
|
template <typename T>
|
||||||
|
string DEOpenCLKernelCreator<T>::CreateGaussianDEKernelNoLocalCache(unsigned int ss)
|
||||||
|
{
|
||||||
|
bool doSS = ss > 1;
|
||||||
|
bool doScf = !(ss & 1);
|
||||||
|
ostringstream os;
|
||||||
|
|
||||||
|
os <<
|
||||||
|
ConstantDefinesString(typeid(T) == typeid(double)) <<
|
||||||
|
DensityFilterCLStructString <<
|
||||||
|
UnionCLStructString <<
|
||||||
|
AddToAccumWithCheckFunctionString <<
|
||||||
|
"__kernel void " << GaussianDEEntryPoint(ss, MaxDEFilterSize() + 1) << "(\n" <<
|
||||||
|
" const __global real4* histogram,\n"
|
||||||
|
" __global real4reals* accumulator,\n"
|
||||||
|
" __constant DensityFilterCL* densityFilter,\n"
|
||||||
|
" const __global real_t* filterCoefs,\n"
|
||||||
|
" const __global real_t* filterWidths,\n"
|
||||||
|
" const __global uint* coefIndices,\n"
|
||||||
|
" const uint chunkSizeW,\n"
|
||||||
|
" const uint chunkSizeH,\n"
|
||||||
|
" const uint rowParity,\n"
|
||||||
|
" const uint colParity\n"
|
||||||
|
"\t)\n"
|
||||||
|
"{\n"
|
||||||
|
//Parity determines if this function should execute.
|
||||||
|
" if ((GLOBAL_ID_X >= densityFilter->m_SuperRasW) ||\n"
|
||||||
|
" (GLOBAL_ID_Y >= densityFilter->m_SuperRasH) ||\n"
|
||||||
|
" ((BLOCK_ID_X % chunkSizeW) != colParity) ||\n"
|
||||||
|
" ((BLOCK_ID_Y % chunkSizeH) != rowParity)) \n"
|
||||||
|
" return;\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
if (doSS)
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" uint ss = (uint)floor((real_t)densityFilter->m_Supersample / 2.0);\n"
|
||||||
|
" int densityBoxLeftX;\n"
|
||||||
|
" int densityBoxRightX;\n"
|
||||||
|
" int densityBoxTopY;\n"
|
||||||
|
" int densityBoxBottomY;\n";
|
||||||
|
|
||||||
|
if (doScf)
|
||||||
|
os << " real_t scfact = pow((real_t)densityFilter->m_Supersample / ((real_t)densityFilter->m_Supersample + 1.0), 2.0);\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
os <<
|
||||||
|
//Compute the bounds of the area to be sampled, which is just the ends minus the super sample minus 1.
|
||||||
|
" uint leftBound = densityFilter->m_Supersample - 1;\n"
|
||||||
|
" uint rightBound = densityFilter->m_SuperRasW - (densityFilter->m_Supersample - 1);\n"
|
||||||
|
" uint topBound = densityFilter->m_Supersample - 1;\n"
|
||||||
|
" uint botBound = densityFilter->m_SuperRasH - (densityFilter->m_Supersample - 1);\n"
|
||||||
|
"\n"
|
||||||
|
//Start and end values are the indices in the histogram read from and written to in the accumulator.
|
||||||
|
//Before computing local offsets, compute the global offsets first to determine if any rows or cols fall outside of the bounds.
|
||||||
|
" uint blockHistStartRow = min(botBound, topBound + (BLOCK_ID_Y * BLOCK_SIZE_Y));\n"//The first histogram row this block will process.
|
||||||
|
" uint threadHistRow = blockHistStartRow + THREAD_ID_Y;\n"//The histogram row this individual thread will be reading from.
|
||||||
|
"\n"
|
||||||
|
" uint blockHistStartCol = min(rightBound, leftBound + (BLOCK_ID_X * BLOCK_SIZE_X));\n"//The first histogram column this block will process.
|
||||||
|
" uint threadHistCol = blockHistStartCol + THREAD_ID_X;\n"//The histogram column this individual thread will be reading from.
|
||||||
|
"\n"
|
||||||
|
" int i, j;\n"
|
||||||
|
" uint filterSelectInt, filterCoefIndex;\n"
|
||||||
|
" real_t cacheLog;\n"
|
||||||
|
" real_t logScale;\n"
|
||||||
|
" real_t filterSelect;\n"
|
||||||
|
" real4 bucket;\n"
|
||||||
|
"\n"
|
||||||
|
" if (threadHistRow < botBound && threadHistCol < rightBound)\n"
|
||||||
|
" {\n"
|
||||||
|
" bucket = histogram[(threadHistRow * densityFilter->m_SuperRasW) + threadHistCol];\n"
|
||||||
|
"\n"
|
||||||
|
" if (bucket.w != 0)\n"
|
||||||
|
" {\n"
|
||||||
|
" cacheLog = (densityFilter->m_K1 * log(1.0 + bucket.w * densityFilter->m_K2)) / bucket.w;\n";
|
||||||
|
|
||||||
|
if (doSS)
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" filterSelect = 0;\n"
|
||||||
|
" densityBoxLeftX = threadHistCol - min(threadHistCol, ss);\n"
|
||||||
|
" densityBoxRightX = threadHistCol + min(ss, (densityFilter->m_SuperRasW - threadHistCol) - 1);\n"
|
||||||
|
" densityBoxTopY = threadHistRow - min(threadHistRow, ss);\n"
|
||||||
|
" densityBoxBottomY = threadHistRow + min(ss, (densityFilter->m_SuperRasH - threadHistRow) - 1);\n"
|
||||||
|
"\n"
|
||||||
|
" for (j = densityBoxTopY; j <= densityBoxBottomY; j++)\n"
|
||||||
|
" {\n"
|
||||||
|
" for (i = densityBoxLeftX; i <= densityBoxRightX; i++)\n"
|
||||||
|
" {\n"
|
||||||
|
" filterSelect += histogram[i + (j * densityFilter->m_SuperRasW)].w;\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
if (doScf)
|
||||||
|
os << " filterSelect *= scfact;\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
os
|
||||||
|
<< " filterSelect = bucket.w;\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
os <<
|
||||||
|
"\n"
|
||||||
|
" if (filterSelect > densityFilter->m_MaxFilteredCounts)\n"
|
||||||
|
" filterSelectInt = densityFilter->m_MaxFilterIndex;\n"
|
||||||
|
" else if (filterSelect <= DE_THRESH)\n"
|
||||||
|
" filterSelectInt = (int)ceil(filterSelect) - 1;\n"
|
||||||
|
" else\n"
|
||||||
|
" filterSelectInt = (int)DE_THRESH + (int)floor(pow((real_t)(filterSelect - DE_THRESH), densityFilter->m_Curve));\n"
|
||||||
|
"\n"
|
||||||
|
" if (filterSelectInt > densityFilter->m_MaxFilterIndex)\n"
|
||||||
|
" filterSelectInt = densityFilter->m_MaxFilterIndex;\n"
|
||||||
|
"\n"
|
||||||
|
" filterCoefIndex = filterSelectInt * densityFilter->m_KernelSize;\n"
|
||||||
|
"\n"
|
||||||
|
" int fw = (int)densityFilter->m_FilterWidth;\n"//Need a signed int to use below.
|
||||||
|
"\n"
|
||||||
|
" for (j = -fw; j <= fw; j++)\n"
|
||||||
|
" {\n"
|
||||||
|
" for (i = -fw; i <= fw; i++)\n"
|
||||||
|
" {\n"
|
||||||
|
" if (AccumCheck(densityFilter->m_SuperRasW, densityFilter->m_SuperRasH, threadHistCol, i, threadHistRow, j))\n"
|
||||||
|
" {\n"
|
||||||
|
" filterSelectInt = filterCoefIndex + coefIndices[(abs(j) * (densityFilter->m_FilterWidth + 1)) + abs(i)];\n"//Really is filterCoeffIndexPlusOffset, but reusing a variable to save space.
|
||||||
|
"\n"
|
||||||
|
" if (filterCoefs[filterSelectInt] != 0)\n"
|
||||||
|
" {\n"
|
||||||
|
" accumulator[(i + threadHistCol) + ((j + threadHistRow) * densityFilter->m_SuperRasW)].m_Real4 += (bucket * (filterCoefs[filterSelectInt] * cacheLog));\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
"\n"
|
||||||
|
" barrier(CLK_GLOBAL_MEM_FENCE);\n"//Required to avoid streaks.
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"//bucket.w != 0.
|
||||||
|
" }\n"//In bounds.
|
||||||
|
"\n"
|
||||||
|
//" barrier(CLK_GLOBAL_MEM_FENCE);\n"//Just to be safe.
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
}
|
89
Source/EmberCL/DEOpenCLKernelCreator.h
Normal file
89
Source/EmberCL/DEOpenCLKernelCreator.h
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "EmberCLPch.h"
|
||||||
|
#include "EmberCLStructs.h"
|
||||||
|
#include "EmberCLFunctions.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// DEOpenCLKernelCreator class.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberCLns
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Kernel creator for density filtering.
|
||||||
|
/// This implements both basic log scale filtering
|
||||||
|
/// as well as the full flam3 density estimation filtering
|
||||||
|
/// in OpenCL.
|
||||||
|
/// Several conditionals are present in the CPU version. They
|
||||||
|
/// are stripped out of the kernels and instead a separate kernel
|
||||||
|
/// is created for every possible case.
|
||||||
|
/// If the filter width is 9 or less, then the entire process can be
|
||||||
|
/// done in shared memory which is very fast.
|
||||||
|
/// However, if the filter width is greater than 9, shared memory is not
|
||||||
|
/// used and all filtering is done directly with main global VRAM. This
|
||||||
|
/// ends up being not much faster than doing it on the CPU.
|
||||||
|
/// String members are kept for the program source and entry points
|
||||||
|
/// for each version of the program.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBERCL_API DEOpenCLKernelCreator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DEOpenCLKernelCreator();
|
||||||
|
DEOpenCLKernelCreator(bool nVidia);
|
||||||
|
|
||||||
|
//Accessors.
|
||||||
|
string LogScaleSumDEKernel();
|
||||||
|
string LogScaleSumDEEntryPoint();
|
||||||
|
string LogScaleAssignDEKernel();
|
||||||
|
string LogScaleAssignDEEntryPoint();
|
||||||
|
string GaussianDEKernel(unsigned int ss, unsigned int filterWidth);
|
||||||
|
string GaussianDEEntryPoint(unsigned int ss, unsigned int filterWidth);
|
||||||
|
|
||||||
|
//Miscellaneous static functions.
|
||||||
|
static unsigned int MaxDEFilterSize();
|
||||||
|
static T SolveMaxDERad(unsigned int maxBoxSize, T desiredFilterSize, T ss);
|
||||||
|
static unsigned int SolveMaxBoxSize(unsigned int localMem);
|
||||||
|
|
||||||
|
private:
|
||||||
|
//Kernel creators.
|
||||||
|
string CreateLogScaleSumDEKernelString();
|
||||||
|
string CreateLogScaleAssignDEKernelString();
|
||||||
|
string CreateGaussianDEKernel(unsigned int ss);
|
||||||
|
string CreateGaussianDEKernelNoLocalCache(unsigned int ss);
|
||||||
|
|
||||||
|
string m_LogScaleSumDEKernel;
|
||||||
|
string m_LogScaleSumDEEntryPoint;
|
||||||
|
|
||||||
|
string m_LogScaleAssignDEKernel;
|
||||||
|
string m_LogScaleAssignDEEntryPoint;
|
||||||
|
|
||||||
|
string m_GaussianDEWithoutSsKernel;
|
||||||
|
string m_GaussianDEWithoutSsEntryPoint;
|
||||||
|
|
||||||
|
string m_GaussianDESsWithScfKernel;
|
||||||
|
string m_GaussianDESsWithScfEntryPoint;
|
||||||
|
|
||||||
|
string m_GaussianDESsWithoutScfKernel;
|
||||||
|
string m_GaussianDESsWithoutScfEntryPoint;
|
||||||
|
|
||||||
|
string m_GaussianDEWithoutSsNoCacheKernel;
|
||||||
|
string m_GaussianDEWithoutSsNoCacheEntryPoint;
|
||||||
|
|
||||||
|
string m_GaussianDESsWithScfNoCacheKernel;
|
||||||
|
string m_GaussianDESsWithScfNoCacheEntryPoint;
|
||||||
|
|
||||||
|
string m_GaussianDESsWithoutScfNoCacheKernel;
|
||||||
|
string m_GaussianDESsWithoutScfNoCacheEntryPoint;
|
||||||
|
|
||||||
|
bool m_NVidia;
|
||||||
|
};
|
||||||
|
|
||||||
|
template EMBERCL_API class DEOpenCLKernelCreator<float>;
|
||||||
|
|
||||||
|
#ifdef DO_DOUBLE
|
||||||
|
template EMBERCL_API class DEOpenCLKernelCreator<double>;
|
||||||
|
#endif
|
||||||
|
}
|
20
Source/EmberCL/DllMain.cpp
Normal file
20
Source/EmberCL/DllMain.cpp
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#include "EmberCLPch.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Generated by Visual Studio to make the DLL run properly.
|
||||||
|
/// </summary>
|
||||||
|
BOOL APIENTRY DllMain( HMODULE hModule,
|
||||||
|
DWORD ul_reason_for_call,
|
||||||
|
LPVOID lpReserved
|
||||||
|
)
|
||||||
|
{
|
||||||
|
switch (ul_reason_for_call)
|
||||||
|
{
|
||||||
|
case DLL_PROCESS_ATTACH:
|
||||||
|
case DLL_THREAD_ATTACH:
|
||||||
|
case DLL_THREAD_DETACH:
|
||||||
|
case DLL_PROCESS_DETACH:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
413
Source/EmberCL/EmberCLFunctions.h
Normal file
413
Source/EmberCL/EmberCLFunctions.h
Normal file
@ -0,0 +1,413 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "EmberCLPch.h"
|
||||||
|
#include "EmberCLStructs.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// OpenCL global function strings.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberCLns
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// OpenCL equivalent of Palette::RgbToHsv().
|
||||||
|
/// </summary>
|
||||||
|
static const char* RgbToHsvFunctionString =
|
||||||
|
//rgb 0 - 1,
|
||||||
|
//h 0 - 6, s 0 - 1, v 0 - 1
|
||||||
|
"static inline void RgbToHsv(real4* rgb, real4* hsv)\n"
|
||||||
|
"{\n"
|
||||||
|
" real_t max, min, del, rc, gc, bc;\n"
|
||||||
|
"\n"
|
||||||
|
//Compute maximum of r, g, b.
|
||||||
|
" if ((*rgb).x >= (*rgb).y)\n"
|
||||||
|
" {\n"
|
||||||
|
" if ((*rgb).x >= (*rgb).z)\n"
|
||||||
|
" max = (*rgb).x;\n"
|
||||||
|
" else\n"
|
||||||
|
" max = (*rgb).z;\n"
|
||||||
|
" }\n"
|
||||||
|
" else\n"
|
||||||
|
" {\n"
|
||||||
|
" if ((*rgb).y >= (*rgb).z)\n"
|
||||||
|
" max = (*rgb).y;\n"
|
||||||
|
" else\n"
|
||||||
|
" max = (*rgb).z;\n"
|
||||||
|
" }\n"
|
||||||
|
"\n"
|
||||||
|
//Compute minimum of r, g, b.
|
||||||
|
" if ((*rgb).x <= (*rgb).y)\n"
|
||||||
|
" {\n"
|
||||||
|
" if ((*rgb).x <= (*rgb).z)\n"
|
||||||
|
" min = (*rgb).x;\n"
|
||||||
|
" else\n"
|
||||||
|
" min = (*rgb).z;\n"
|
||||||
|
" }\n"
|
||||||
|
" else\n"
|
||||||
|
" {\n"
|
||||||
|
" if ((*rgb).y <= (*rgb).z)\n"
|
||||||
|
" min = (*rgb).y;\n"
|
||||||
|
" else\n"
|
||||||
|
" min = (*rgb).z;\n"
|
||||||
|
" }\n"
|
||||||
|
"\n"
|
||||||
|
" del = max - min;\n"
|
||||||
|
" (*hsv).z = max;\n"
|
||||||
|
"\n"
|
||||||
|
" if (max != 0)\n"
|
||||||
|
" (*hsv).y = del / max;\n"
|
||||||
|
" else\n"
|
||||||
|
" (*hsv).y = 0;\n"
|
||||||
|
"\n"
|
||||||
|
" (*hsv).x = 0;\n"
|
||||||
|
" if ((*hsv).y != 0)\n"
|
||||||
|
" {\n"
|
||||||
|
" rc = (max - (*rgb).x) / del;\n"
|
||||||
|
" gc = (max - (*rgb).y) / del;\n"
|
||||||
|
" bc = (max - (*rgb).z) / del;\n"
|
||||||
|
"\n"
|
||||||
|
" if ((*rgb).x == max)\n"
|
||||||
|
" (*hsv).x = bc - gc;\n"
|
||||||
|
" else if ((*rgb).y == max)\n"
|
||||||
|
" (*hsv).x = 2 + rc - bc;\n"
|
||||||
|
" else if ((*rgb).z == max)\n"
|
||||||
|
" (*hsv).x = 4 + gc - rc;\n"
|
||||||
|
"\n"
|
||||||
|
" if ((*hsv).x < 0)\n"
|
||||||
|
" (*hsv).x += 6;\n"
|
||||||
|
" }\n"
|
||||||
|
"}\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// OpenCL equivalent of Palette::HsvToRgb().
|
||||||
|
/// </summary>
|
||||||
|
static const char* HsvToRgbFunctionString =
|
||||||
|
//h 0 - 6, s 0 - 1, v 0 - 1
|
||||||
|
//rgb 0 - 1
|
||||||
|
"static inline void HsvToRgb(real4* hsv, real4* rgb)\n"
|
||||||
|
"{\n"
|
||||||
|
" int j;\n"
|
||||||
|
" real_t f, p, q, t;\n"
|
||||||
|
"\n"
|
||||||
|
" while ((*hsv).x >= 6)\n"
|
||||||
|
" (*hsv).x = (*hsv).x - 6;\n"
|
||||||
|
"\n"
|
||||||
|
" while ((*hsv).x < 0)\n"
|
||||||
|
" (*hsv).x = (*hsv).x + 6;\n"
|
||||||
|
"\n"
|
||||||
|
" j = (int)floor((*hsv).x);\n"
|
||||||
|
" f = (*hsv).x - j;\n"
|
||||||
|
" p = (*hsv).z * (1 - (*hsv).y);\n"
|
||||||
|
" q = (*hsv).z * (1 - ((*hsv).y * f));\n"
|
||||||
|
" t = (*hsv).z * (1 - ((*hsv).y * (1 - f)));\n"
|
||||||
|
"\n"
|
||||||
|
" switch (j)\n"
|
||||||
|
" {\n"
|
||||||
|
" case 0: (*rgb).x = (*hsv).z; (*rgb).y = t; (*rgb).z = p; break;\n"
|
||||||
|
" case 1: (*rgb).x = q; (*rgb).y = (*hsv).z; (*rgb).z = p; break;\n"
|
||||||
|
" case 2: (*rgb).x = p; (*rgb).y = (*hsv).z; (*rgb).z = t; break;\n"
|
||||||
|
" case 3: (*rgb).x = p; (*rgb).y = q; (*rgb).z = (*hsv).z; break;\n"
|
||||||
|
" case 4: (*rgb).x = t; (*rgb).y = p; (*rgb).z = (*hsv).z; break;\n"
|
||||||
|
" case 5: (*rgb).x = (*hsv).z; (*rgb).y = p; (*rgb).z = q; break;\n"
|
||||||
|
" default: (*rgb).x = (*hsv).z; (*rgb).y = t; (*rgb).z = p; break;\n"
|
||||||
|
" }\n"
|
||||||
|
"}\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// OpenCL equivalent of Palette::CalcAlpha().
|
||||||
|
/// </summary>
|
||||||
|
static const char* CalcAlphaFunctionString =
|
||||||
|
"static inline real_t CalcAlpha(real_t density, real_t gamma, real_t linrange)\n"//Not the slightest clue what this is doing.//DOC
|
||||||
|
"{\n"
|
||||||
|
" real_t frac, alpha, funcval = pow(linrange, gamma);\n"
|
||||||
|
"\n"
|
||||||
|
" if (density > 0)\n"
|
||||||
|
" {\n"
|
||||||
|
" if (density < linrange)\n"
|
||||||
|
" {\n"
|
||||||
|
" frac = density / linrange;\n"
|
||||||
|
" alpha = (1.0 - frac) * density * (funcval / linrange) + frac * pow(density, gamma);\n"
|
||||||
|
" }\n"
|
||||||
|
" else\n"
|
||||||
|
" alpha = pow(density, gamma);\n"
|
||||||
|
" }\n"
|
||||||
|
" else\n"
|
||||||
|
" alpha = 0;\n"
|
||||||
|
"\n"
|
||||||
|
" return alpha;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Use MWC 64 from David Thomas at the Imperial College of London for
|
||||||
|
/// random numbers in OpenCL, instead of ISAAC which was used
|
||||||
|
/// for CPU rendering.
|
||||||
|
/// </summary>
|
||||||
|
static const char* RandFunctionString =
|
||||||
|
"enum { MWC64X_A = 4294883355u };\n\n"
|
||||||
|
"inline uint MwcNext(uint2* s)\n"
|
||||||
|
"{\n"
|
||||||
|
" uint res = (*s).x ^ (*s).y; \n"//Calculate the result.
|
||||||
|
" uint hi = mul_hi((*s).x, MWC64X_A); \n"//Step the RNG.
|
||||||
|
" (*s).x = (*s).x * MWC64X_A + (*s).y;\n"//Pack the state back up.
|
||||||
|
" (*s).y = hi + ((*s).x < (*s).y); \n"
|
||||||
|
" return res; \n"//Return the next result.
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline uint MwcNextRange(uint2* s, uint val)\n"
|
||||||
|
"{\n"
|
||||||
|
" return (val == 0) ? MwcNext(s) : (MwcNext(s) % val);\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t MwcNext01(uint2* s)\n"
|
||||||
|
"{\n"
|
||||||
|
" return MwcNext(s) * (1.0 / 4294967296.0);\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t MwcNextNeg1Pos1(uint2* s)\n"
|
||||||
|
"{\n"
|
||||||
|
" real_t f = (real_t)MwcNext(s) / UINT_MAX;\n"
|
||||||
|
" return -1.0 + (f * (1.0 - (-1.0)));\n"
|
||||||
|
"}\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// OpenCL equivalent of the global ClampRef().
|
||||||
|
/// </summary>
|
||||||
|
static const char* ClampRealFunctionString =
|
||||||
|
"inline real_t Clamp(real_t val, real_t min, real_t max)\n"
|
||||||
|
"{\n"
|
||||||
|
" if (val < min)\n"
|
||||||
|
" return min;\n"
|
||||||
|
" else if (val > max)\n"
|
||||||
|
" return max;\n"
|
||||||
|
" else\n"
|
||||||
|
" return val;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline void ClampRef(real_t* val, real_t min, real_t max)\n"
|
||||||
|
"{\n"
|
||||||
|
" if (*val < min)\n"
|
||||||
|
" *val = min;\n"
|
||||||
|
" else if (*val > max)\n"
|
||||||
|
" *val = max;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t ClampGte(real_t val, real_t gte)\n"
|
||||||
|
"{\n"
|
||||||
|
" return (val < gte) ? gte : val;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// OpenCL equivalent of the global LRint().
|
||||||
|
/// </summary>
|
||||||
|
static const char* InlineMathFunctionsString =
|
||||||
|
"inline real_t LRint(real_t x)\n"
|
||||||
|
"{\n"
|
||||||
|
" intPrec temp = (x >= 0.0 ? (intPrec)(x + 0.5) : (intPrec)(x - 0.5));\n"
|
||||||
|
" return (real_t)temp;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t Round(real_t r)\n"
|
||||||
|
"{\n"
|
||||||
|
" return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t Sign(real_t v)\n"
|
||||||
|
"{\n"
|
||||||
|
" return (v < 0.0) ? -1 : (v > 0.0) ? 1 : 0.0;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t SignNz(real_t v)\n"
|
||||||
|
"{\n"
|
||||||
|
" return (v < 0.0) ? -1.0 : 1.0;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t Sqr(real_t v)\n"
|
||||||
|
"{\n"
|
||||||
|
" return v * v;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t SafeSqrt(real_t x)\n"
|
||||||
|
"{\n"
|
||||||
|
" if (x <= 0.0)\n"
|
||||||
|
" return 0.0;\n"
|
||||||
|
"\n"
|
||||||
|
" return sqrt(x);\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t Cube(real_t v)\n"
|
||||||
|
"{\n"
|
||||||
|
" return v * v * v;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t Hypot(real_t x, real_t y)\n"
|
||||||
|
"{\n"
|
||||||
|
" return sqrt(SQR(x) + SQR(y));\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t Spread(real_t x, real_t y)\n"
|
||||||
|
"{\n"
|
||||||
|
" return Hypot(x, y) * ((x) > 0.0 ? 1.0 : -1.0);\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t Powq4(real_t x, real_t y)\n"
|
||||||
|
"{\n"
|
||||||
|
" return pow(fabs(x), y) * SignNz(x);\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t Powq4c(real_t x, real_t y)\n"
|
||||||
|
"{\n"
|
||||||
|
" return y == 1.0 ? x : Powq4(x, y);\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t Zeps(real_t x)\n"
|
||||||
|
"{\n"
|
||||||
|
" return x == 0.0 ? EPS6 : x;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t Lerp(real_t a, real_t b, real_t p)\n"
|
||||||
|
"{\n"
|
||||||
|
" return a + (b - a) * p;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t Fabsmod(real_t v)\n"
|
||||||
|
"{\n"
|
||||||
|
" real_t dummy;\n"
|
||||||
|
"\n"
|
||||||
|
" return modf(v, &dummy);\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t Fosc(real_t p, real_t amp, real_t ph)\n"
|
||||||
|
"{\n"
|
||||||
|
" return 0.5 - cos(p * amp + ph) * 0.5;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t Foscn(real_t p, real_t ph)\n"
|
||||||
|
"{\n"
|
||||||
|
" return 0.5 - cos(p + ph) * 0.5;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t LogScale(real_t x)\n"
|
||||||
|
"{\n"
|
||||||
|
" return x == 0.0 ? 0.0 : log((fabs(x) + 1) * M_E) * SignNz(x) / M_E;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline real_t LogMap(real_t x)\n"
|
||||||
|
"{\n"
|
||||||
|
" return x == 0.0 ? 0.0 : (M_E + log(x * M_E)) * 0.25 * SignNz(x);\n"
|
||||||
|
"}\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// OpenCL equivalent Renderer::AddToAccum().
|
||||||
|
/// </summary>
|
||||||
|
static const char* AddToAccumWithCheckFunctionString =
|
||||||
|
"inline bool AccumCheck(int superRasW, int superRasH, int i, int ii, int j, int jj)\n"
|
||||||
|
"{\n"
|
||||||
|
" return (j + jj >= 0 && j + jj < superRasH && i + ii >= 0 && i + ii < superRasW);\n"
|
||||||
|
"}\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// OpenCL equivalent various CarToRas member functions.
|
||||||
|
/// </summary>
|
||||||
|
static const char* CarToRasFunctionString =
|
||||||
|
"inline void CarToRasConvertPointToSingle(__constant CarToRasCL* carToRas, Point* point, unsigned int* singleBufferIndex)\n"
|
||||||
|
"{\n"
|
||||||
|
" *singleBufferIndex = (unsigned int)(carToRas->m_PixPerImageUnitW * point->m_X - carToRas->m_RasLlX) + (carToRas->m_RasWidth * (unsigned int)(carToRas->m_PixPerImageUnitH * point->m_Y - carToRas->m_RasLlY));\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"inline bool CarToRasInBounds(__constant CarToRasCL* carToRas, Point* point)\n"
|
||||||
|
"{\n"
|
||||||
|
" return point->m_X >= carToRas->m_CarLlX &&\n"
|
||||||
|
" point->m_X < carToRas->m_CarUrX &&\n"
|
||||||
|
" point->m_Y < carToRas->m_CarUrY &&\n"
|
||||||
|
" point->m_Y >= carToRas->m_CarLlY;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
static string AtomicString(bool doublePrecision, bool dp64AtomicSupport)
|
||||||
|
{
|
||||||
|
ostringstream os;
|
||||||
|
|
||||||
|
//If they want single precision, or if they want double precision and have dp atomic support.
|
||||||
|
if (!doublePrecision || dp64AtomicSupport)
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
"void AtomicAdd(volatile __global real_t* source, const real_t operand)\n"
|
||||||
|
"{\n"
|
||||||
|
" union\n"
|
||||||
|
" {\n"
|
||||||
|
" atomi intVal;\n"
|
||||||
|
" real_t realVal;\n"
|
||||||
|
" } newVal;\n"
|
||||||
|
"\n"
|
||||||
|
" union\n"
|
||||||
|
" {\n"
|
||||||
|
" atomi intVal;\n"
|
||||||
|
" real_t realVal;\n"
|
||||||
|
" } prevVal;\n"
|
||||||
|
"\n"
|
||||||
|
" do\n"
|
||||||
|
" {\n"
|
||||||
|
" prevVal.realVal = *source;\n"
|
||||||
|
" newVal.realVal = prevVal.realVal + operand;\n"
|
||||||
|
" } while (atomic_cmpxchg((volatile __global atomi*)source, prevVal.intVal, newVal.intVal) != prevVal.intVal);\n"
|
||||||
|
"}\n";
|
||||||
|
}
|
||||||
|
else//They want double precision and do not have dp atomic support.
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
"void AtomicAdd(volatile __global real_t* source, const real_t operand)\n"
|
||||||
|
"{\n"
|
||||||
|
" union\n"
|
||||||
|
" {\n"
|
||||||
|
" uint intVal[2];\n"
|
||||||
|
" real_t realVal;\n"
|
||||||
|
" } newVal;\n"
|
||||||
|
"\n"
|
||||||
|
" union\n"
|
||||||
|
" {\n"
|
||||||
|
" uint intVal[2];\n"
|
||||||
|
" real_t realVal;\n"
|
||||||
|
" } prevVal;\n"
|
||||||
|
"\n"
|
||||||
|
" do\n"
|
||||||
|
" {\n"
|
||||||
|
" prevVal.realVal = *source;\n"
|
||||||
|
" newVal.realVal = prevVal.realVal + operand;\n"
|
||||||
|
" } while ((atomic_cmpxchg((volatile __global uint*)source, prevVal.intVal[0], newVal.intVal[0]) != prevVal.intVal[0]) ||\n"
|
||||||
|
" (atomic_cmpxchg((volatile __global uint*)source + 1, prevVal.intVal[1], newVal.intVal[1]) != prevVal.intVal[1]));\n"
|
||||||
|
"}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef GRAVEYARD
|
||||||
|
/*"void AtomicLocalAdd(volatile __local real_t* source, const real_t operand)\n"
|
||||||
|
"{\n"
|
||||||
|
" union\n"
|
||||||
|
" {\n"
|
||||||
|
" atomi intVal;\n"
|
||||||
|
" real_t realVal;\n"
|
||||||
|
" } newVal;\n"
|
||||||
|
"\n"
|
||||||
|
" union\n"
|
||||||
|
" {\n"
|
||||||
|
" atomi intVal;\n"
|
||||||
|
" real_t realVal;\n"
|
||||||
|
" } prevVal;\n"
|
||||||
|
"\n"
|
||||||
|
" do\n"
|
||||||
|
" {\n"
|
||||||
|
" prevVal.realVal = *source;\n"
|
||||||
|
" newVal.realVal = prevVal.realVal + operand;\n"
|
||||||
|
" } while (atomic_cmpxchg((volatile __local atomi*)source, prevVal.intVal, newVal.intVal) != prevVal.intVal);\n"
|
||||||
|
"}\n"*/
|
||||||
|
#endif
|
||||||
|
}
|
39
Source/EmberCL/EmberCLPch.h
Normal file
39
Source/EmberCL/EmberCLPch.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Precompiled header file. Place all system includes here with appropriate #defines for different operating systems and compilers.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
#define NOMINMAX
|
||||||
|
#define WIN32_LEAN_AND_MEAN//Exclude rarely-used stuff from Windows headers.
|
||||||
|
#define _USE_MATH_DEFINES
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#include <SDKDDKVer.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <utility>
|
||||||
|
#include <CL/cl.hpp>
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <iterator>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "Timing.h"
|
||||||
|
#include "Renderer.h"
|
||||||
|
|
||||||
|
#if defined(BUILDING_EMBERCL)
|
||||||
|
#define EMBERCL_API __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define EMBERCL_API __declspec(dllimport)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace EmberNs;
|
||||||
|
//#define TEST_CL 1
|
383
Source/EmberCL/EmberCLStructs.h
Normal file
383
Source/EmberCL/EmberCLStructs.h
Normal file
@ -0,0 +1,383 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "EmberCLPch.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Various data structures defined for the CPU and OpenCL.
|
||||||
|
/// These are stripped down versions of THE classes in Ember, for use with OpenCL.
|
||||||
|
/// Their sole purpose is to pass values from the host to the device.
|
||||||
|
/// They retain most of the member variables, but do not contain the functions.
|
||||||
|
/// Visual Studio defaults to alighment of 16, but it's made explicit in case another compiler is used.
|
||||||
|
/// This must match the alignment specified in the kernel.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberCLns
|
||||||
|
{
|
||||||
|
#define ALIGN __declspec(align(16))//These two must always match.
|
||||||
|
#define ALIGN_CL "((aligned (16)))"//The extra parens are necessary.
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Various constants needed for rendering.
|
||||||
|
/// </summary>
|
||||||
|
static string ConstantDefinesString(bool doublePrecision)
|
||||||
|
{
|
||||||
|
ostringstream os;
|
||||||
|
|
||||||
|
if (doublePrecision)
|
||||||
|
{
|
||||||
|
os << "#if defined(cl_amd_fp64)\n"//AMD extension available?
|
||||||
|
<< " #pragma OPENCL EXTENSION cl_amd_fp64 : enable\n"
|
||||||
|
<< "#endif\n"
|
||||||
|
<< "#if defined(cl_khr_fp64)\n"//Khronos extension available?
|
||||||
|
<< " #pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
|
||||||
|
<< "#endif\n"
|
||||||
|
<< "#pragma OPENCL EXTENSION cl_khr_int64_base_atomics : enable\n"//Only supported on nVidia.
|
||||||
|
<< "typedef long intPrec;\n"
|
||||||
|
<< "typedef ulong atomi;\n"
|
||||||
|
<< "typedef double real_t;\n"
|
||||||
|
<< "typedef double4 real4;\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
os << "typedef int intPrec;\n"
|
||||||
|
"typedef unsigned int atomi;\n"
|
||||||
|
"typedef float real_t;\n"
|
||||||
|
"typedef float4 real4;\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
os <<
|
||||||
|
"typedef long int int64;\n"
|
||||||
|
"typedef unsigned long int uint64;\n"
|
||||||
|
"\n"
|
||||||
|
"#define EPS ((1e-10))\n"//May need to change this, it might not be enough in some cases. Maybe try 1e-9 if things look funny when close to zero.
|
||||||
|
"#define EPS6 ((1e-6))\n"
|
||||||
|
"\n"
|
||||||
|
"//The number of threads per block used in the iteration function. Don't change\n"
|
||||||
|
"//it lightly; the block size is hard coded to be exactly 32 x 8.\n"
|
||||||
|
"#define NTHREADS 256u\n"
|
||||||
|
"#define THREADS_PER_WARP 32u\n"
|
||||||
|
"#define NWARPS (NTHREADS / THREADS_PER_WARP)\n"
|
||||||
|
"#define COLORMAP_LENGTH 256u\n"
|
||||||
|
"#define COLORMAP_LENGTH_MINUS_1 255u\n"
|
||||||
|
"#define DE_THRESH 100u\n"
|
||||||
|
"#define BadVal(x) (((x) != (x)) || ((x) > 1e10) || ((x) < -1e10))\n"
|
||||||
|
"#define Rint(A) floor((A) + (((A) < 0) ? -0.5 : 0.5))\n"
|
||||||
|
"#define SQR(x) ((x) * (x))\n"
|
||||||
|
"#define CUBE(x) ((x) * (x) * (x))\n"
|
||||||
|
"#define M_2PI (M_PI * 2)\n"
|
||||||
|
"#define M_3PI (M_PI * 3)\n"
|
||||||
|
"#define SQRT5 2.2360679774997896964091736687313\n"
|
||||||
|
"#define M_PHI 1.61803398874989484820458683436563\n"
|
||||||
|
"#define DEG_2_RAD (M_PI / 180)\n"
|
||||||
|
"\n"
|
||||||
|
"//Index in each dimension of a thread within a block.\n"
|
||||||
|
"#define THREAD_ID_X (get_local_id(0))\n"
|
||||||
|
"#define THREAD_ID_Y (get_local_id(1))\n"
|
||||||
|
"#define THREAD_ID_Z (get_local_id(2))\n"
|
||||||
|
"\n"
|
||||||
|
"//Index in each dimension of a block within a grid.\n"
|
||||||
|
"#define BLOCK_ID_X (get_group_id(0))\n"
|
||||||
|
"#define BLOCK_ID_Y (get_group_id(1))\n"
|
||||||
|
"#define BLOCK_ID_Z (get_group_id(2))\n"
|
||||||
|
"\n"
|
||||||
|
"//Absolute index in each dimension of a thread within a grid.\n"
|
||||||
|
"#define GLOBAL_ID_X (get_global_id(0))\n"
|
||||||
|
"#define GLOBAL_ID_Y (get_global_id(1))\n"
|
||||||
|
"#define GLOBAL_ID_Z (get_global_id(2))\n"
|
||||||
|
"\n"
|
||||||
|
"//Dimensions of a block.\n"
|
||||||
|
"#define BLOCK_SIZE_X (get_local_size(0))\n"
|
||||||
|
"#define BLOCK_SIZE_Y (get_local_size(1))\n"
|
||||||
|
"#define BLOCK_SIZE_Z (get_local_size(2))\n"
|
||||||
|
"\n"
|
||||||
|
"//Dimensions of a grid, in terms of blocks.\n"
|
||||||
|
"#define GRID_SIZE_X (get_num_groups(0))\n"
|
||||||
|
"#define GRID_SIZE_Y (get_num_groups(1))\n"
|
||||||
|
"#define GRID_SIZE_Z (get_num_groups(2))\n"
|
||||||
|
"\n"
|
||||||
|
"//Dimensions of a grid, in terms of threads.\n"
|
||||||
|
"#define GLOBAL_SIZE_X (get_global_size(0))\n"
|
||||||
|
"#define GLOBAL_SIZE_Y (get_global_size(1))\n"
|
||||||
|
"#define GLOBAL_SIZE_Z (get_global_size(2))\n"
|
||||||
|
"\n"
|
||||||
|
"#define INDEX_IN_BLOCK_2D (THREAD_ID_Y * BLOCK_SIZE_X + THREAD_ID_X)\n"
|
||||||
|
"#define INDEX_IN_BLOCK_3D ((BLOCK_SIZE_X * BLOCK_SIZE_Y * THREAD_ID_Z) + INDEX_IN_BLOCK_2D)\n"
|
||||||
|
"\n"
|
||||||
|
"#define INDEX_IN_GRID_2D (GLOBAL_ID_Y * GLOBAL_SIZE_X + GLOBAL_ID_X)\n"
|
||||||
|
"#define INDEX_IN_GRID_3D ((GLOBAL_SIZE_X * GLOBAL_SIZE_Y * GLOBAL_ID_Z) + INDEX_IN_GRID_2D)\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A point structure on the host that maps to the one used on the device to iterate in OpenCL.
|
||||||
|
/// It might seem better to use vec4, however 2D palettes and even 3D coordinates may eventually
|
||||||
|
/// be supported, which will make it more than 4 members.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
struct ALIGN PointCL
|
||||||
|
{
|
||||||
|
T m_X;
|
||||||
|
T m_Y;
|
||||||
|
T m_Z;
|
||||||
|
T m_ColorX;
|
||||||
|
T m_LastXfUsed;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The point structure used to iterate in OpenCL.
|
||||||
|
/// It might seem better to use float4, however 2D palettes and even 3D coordinates may eventually
|
||||||
|
/// be supported, which will make it more than 4 members.
|
||||||
|
/// </summary>
|
||||||
|
static const char* PointCLStructString =
|
||||||
|
"typedef struct __attribute__ " ALIGN_CL " _Point\n"
|
||||||
|
"{\n"
|
||||||
|
" real_t m_X;\n"
|
||||||
|
" real_t m_Y;\n"
|
||||||
|
" real_t m_Z;\n"
|
||||||
|
" real_t m_ColorX;\n"
|
||||||
|
" uint m_LastXfUsed;\n"
|
||||||
|
"} Point;\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
#define MAX_CL_VARS 8//These must always match.
|
||||||
|
#define MAX_CL_VARS_STRING "8"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A structure on the host used to hold all of the needed information for an xform used on the device to iterate in OpenCL.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
struct ALIGN XformCL
|
||||||
|
{
|
||||||
|
T m_A, m_B, m_C, m_D, m_E, m_F;//24 (48)
|
||||||
|
T m_VariationWeights[MAX_CL_VARS];//56 (112)
|
||||||
|
T m_PostA, m_PostB, m_PostC, m_PostD, m_PostE, m_PostF;//80 (160)
|
||||||
|
T m_DirectColor;//84 (168)
|
||||||
|
T m_ColorSpeedCache;//88 (176)
|
||||||
|
T m_OneMinusColorCache;//92 (184)
|
||||||
|
T m_Opacity;//96 (192)
|
||||||
|
T m_VizAdjusted;//100 (200)
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The xform structure used to iterate in OpenCL.
|
||||||
|
/// </summary>
|
||||||
|
static const char* XformCLStructString =
|
||||||
|
"typedef struct __attribute__ " ALIGN_CL " _XformCL\n"
|
||||||
|
"{\n"
|
||||||
|
" real_t m_A, m_B, m_C, m_D, m_E, m_F;\n"
|
||||||
|
" real_t m_VariationWeights[" MAX_CL_VARS_STRING "];\n"
|
||||||
|
" real_t m_PostA, m_PostB, m_PostC, m_PostD, m_PostE, m_PostF;\n"
|
||||||
|
" real_t m_DirectColor;\n"
|
||||||
|
" real_t m_ColorSpeedCache;\n"
|
||||||
|
" real_t m_OneMinusColorCache;\n"
|
||||||
|
" real_t m_Opacity;\n"
|
||||||
|
" real_t m_VizAdjusted;\n"
|
||||||
|
"} XformCL;\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
#define MAX_CL_XFORM 21//These must always match.
|
||||||
|
#define MAX_CL_XFORM_STRING "21"
|
||||||
|
|
||||||
|
/// <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.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
struct ALIGN EmberCL
|
||||||
|
{
|
||||||
|
unsigned int m_FinalXformIndex;
|
||||||
|
XformCL<T> m_Xforms[MAX_CL_XFORM];
|
||||||
|
T m_CamZPos;
|
||||||
|
T m_CamPerspective;
|
||||||
|
T m_CamYaw;
|
||||||
|
T m_CamPitch;
|
||||||
|
T m_CamDepthBlur;
|
||||||
|
T m_BlurCoef;
|
||||||
|
m3T m_CamMat;
|
||||||
|
T m_CenterX, m_CenterY;
|
||||||
|
T m_RotA, m_RotB, m_RotD, m_RotE;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The ember structure used to iterate in OpenCL.
|
||||||
|
/// </summary>
|
||||||
|
static const char* EmberCLStructString =
|
||||||
|
"typedef struct __attribute__ " ALIGN_CL " _EmberCL\n"
|
||||||
|
"{\n"
|
||||||
|
" uint m_FinalXformIndex;\n"
|
||||||
|
" XformCL m_Xforms[" MAX_CL_XFORM_STRING "];\n"
|
||||||
|
" real_t m_CamZPos;\n"
|
||||||
|
" real_t m_CamPerspective;\n"
|
||||||
|
" real_t m_CamYaw;\n"
|
||||||
|
" real_t m_CamPitch;\n"
|
||||||
|
" real_t m_CamDepthBlur;\n"
|
||||||
|
" real_t m_BlurCoef;\n"
|
||||||
|
" real_t m_C00;\n"
|
||||||
|
" real_t m_C01;\n"
|
||||||
|
" real_t m_C02;\n"
|
||||||
|
" real_t m_C10;\n"
|
||||||
|
" real_t m_C11;\n"
|
||||||
|
" real_t m_C12;\n"
|
||||||
|
" real_t m_C20;\n"
|
||||||
|
" real_t m_C21;\n"
|
||||||
|
" real_t m_C22;\n"
|
||||||
|
" real_t m_CenterX, m_CenterY;\n"
|
||||||
|
" real_t m_RotA, m_RotB, m_RotD, m_RotE;\n"
|
||||||
|
"} EmberCL;\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
/// <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.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
struct ALIGN CarToRasCL
|
||||||
|
{
|
||||||
|
T m_PixPerImageUnitW, m_RasLlX;
|
||||||
|
unsigned int m_RasWidth;
|
||||||
|
T m_PixPerImageUnitH, m_RasLlY;
|
||||||
|
T m_CarLlX, m_CarUrX, m_CarUrY, m_CarLlY;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The cartesian to raster structure used to iterate in OpenCL.
|
||||||
|
/// </summary>
|
||||||
|
static const char* CarToRasCLStructString =
|
||||||
|
"typedef struct __attribute__ " ALIGN_CL " _CarToRasCL\n"
|
||||||
|
"{\n"
|
||||||
|
" real_t m_PixPerImageUnitW, m_RasLlX;\n"
|
||||||
|
" uint m_RasWidth;\n"
|
||||||
|
" real_t m_PixPerImageUnitH, m_RasLlY;\n"
|
||||||
|
" real_t m_CarLlX, m_CarUrX, m_CarUrY, m_CarLlY;\n"
|
||||||
|
"} CarToRasCL;\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
/// <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.
|
||||||
|
/// Note that the actual filter buffer is held elsewhere.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
struct ALIGN DensityFilterCL
|
||||||
|
{
|
||||||
|
T m_Curve;
|
||||||
|
T m_K1;
|
||||||
|
T m_K2;
|
||||||
|
unsigned int m_Supersample;
|
||||||
|
unsigned int m_SuperRasW;
|
||||||
|
unsigned int m_SuperRasH;
|
||||||
|
unsigned int m_KernelSize;
|
||||||
|
unsigned int m_MaxFilterIndex;
|
||||||
|
unsigned int m_MaxFilteredCounts;
|
||||||
|
unsigned int m_FilterWidth;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The density filtering structure used to iterate in OpenCL.
|
||||||
|
/// Note that the actual filter buffer is held elsewhere.
|
||||||
|
/// </summary>
|
||||||
|
static const char* DensityFilterCLStructString =
|
||||||
|
"typedef struct __attribute__ " ALIGN_CL " _DensityFilterCL\n"
|
||||||
|
"{\n"
|
||||||
|
" real_t m_Curve;\n"
|
||||||
|
" real_t m_K1;\n"
|
||||||
|
" real_t m_K2;\n"
|
||||||
|
" uint m_Supersample;\n"
|
||||||
|
" uint m_SuperRasW;\n"
|
||||||
|
" uint m_SuperRasH;\n"
|
||||||
|
" uint m_KernelSize;\n"
|
||||||
|
" uint m_MaxFilterIndex;\n"
|
||||||
|
" uint m_MaxFilteredCounts;\n"
|
||||||
|
" uint m_FilterWidth;\n"
|
||||||
|
"} DensityFilterCL;\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
/// <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.
|
||||||
|
/// Note that the actual filter buffer is held elsewhere.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
struct ALIGN SpatialFilterCL
|
||||||
|
{
|
||||||
|
unsigned int m_SuperRasW;
|
||||||
|
unsigned int m_SuperRasH;
|
||||||
|
unsigned int m_FinalRasW;
|
||||||
|
unsigned int m_FinalRasH;
|
||||||
|
unsigned int m_Supersample;
|
||||||
|
unsigned int m_FilterWidth;
|
||||||
|
unsigned int m_NumChannels;
|
||||||
|
unsigned int m_BytesPerChannel;
|
||||||
|
unsigned int m_DensityFilterOffset;
|
||||||
|
unsigned int m_Transparency;
|
||||||
|
T m_Vibrancy;
|
||||||
|
T m_HighlightPower;
|
||||||
|
T m_Gamma;
|
||||||
|
T m_LinRange;
|
||||||
|
Color<T> m_Background;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The spatial filtering structure used to iterate in OpenCL.
|
||||||
|
/// Note that the actual filter buffer is held elsewhere.
|
||||||
|
/// </summary>
|
||||||
|
static const char* SpatialFilterCLStructString =
|
||||||
|
"typedef struct __attribute__ ((aligned (16))) _SpatialFilterCL\n"
|
||||||
|
"{\n"
|
||||||
|
" uint m_SuperRasW;\n"
|
||||||
|
" uint m_SuperRasH;\n"
|
||||||
|
" uint m_FinalRasW;\n"
|
||||||
|
" uint m_FinalRasH;\n"
|
||||||
|
" uint m_Supersample;\n"
|
||||||
|
" uint m_FilterWidth;\n"
|
||||||
|
" uint m_NumChannels;\n"
|
||||||
|
" uint m_BytesPerChannel;\n"
|
||||||
|
" uint m_DensityFilterOffset;\n"
|
||||||
|
" uint m_Transparency;\n"
|
||||||
|
" real_t m_Vibrancy;\n"
|
||||||
|
" real_t m_HighlightPower;\n"
|
||||||
|
" real_t m_Gamma;\n"
|
||||||
|
" real_t m_LinRange;\n"
|
||||||
|
" real_t m_Background[4];\n"//For some reason, using float4/double4 here does not align no matter what. So just use an array of 4.
|
||||||
|
"} SpatialFilterCL;\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// EmberCL makes extensive use of the build in vector types, however accessing
|
||||||
|
/// their members as a buffer is not natively supported.
|
||||||
|
/// Declaring them in a union with a buffer resolves this problem.
|
||||||
|
/// </summary>
|
||||||
|
static const char* UnionCLStructString =
|
||||||
|
"typedef union\n"
|
||||||
|
"{\n"
|
||||||
|
" uchar3 m_Uchar3;\n"
|
||||||
|
" uchar m_Uchars[3];\n"
|
||||||
|
"} uchar3uchars;\n"
|
||||||
|
"\n"
|
||||||
|
"typedef union\n"
|
||||||
|
"{\n"
|
||||||
|
" uchar4 m_Uchar4;\n"
|
||||||
|
" uchar m_Uchars[4];\n"
|
||||||
|
"} uchar4uchars;\n"
|
||||||
|
"\n"
|
||||||
|
"typedef union\n"
|
||||||
|
"{\n"
|
||||||
|
" uint4 m_Uint4;\n"
|
||||||
|
" uint m_Uints[4];\n"
|
||||||
|
"} uint4uints;\n"
|
||||||
|
"\n"
|
||||||
|
"typedef union\n"//Use in places where float is required.
|
||||||
|
"{\n"
|
||||||
|
" float4 m_Float4;\n"
|
||||||
|
" float m_Floats[4];\n"
|
||||||
|
"} float4floats;\n"
|
||||||
|
"\n"
|
||||||
|
"typedef union\n"//Use in places where float or double can be used depending on the template type.
|
||||||
|
"{\n"
|
||||||
|
" real4 m_Real4;\n"
|
||||||
|
" real_t m_Reals[4];\n"
|
||||||
|
"} real4reals;\n"
|
||||||
|
"\n";
|
||||||
|
}
|
517
Source/EmberCL/FinalAccumOpenCLKernelCreator.cpp
Normal file
517
Source/EmberCL/FinalAccumOpenCLKernelCreator.cpp
Normal file
@ -0,0 +1,517 @@
|
|||||||
|
#include "EmberCLPch.h"
|
||||||
|
#include "FinalAccumOpenCLKernelCreator.h"
|
||||||
|
|
||||||
|
namespace EmberCLns
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor that creates all kernel strings.
|
||||||
|
/// The caller will access these strings through the accessor functions.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
FinalAccumOpenCLKernelCreator<T>::FinalAccumOpenCLKernelCreator()
|
||||||
|
{
|
||||||
|
m_GammaCorrectionWithAlphaCalcEntryPoint = "GammaCorrectionWithAlphaCalcKernel";
|
||||||
|
m_GammaCorrectionWithoutAlphaCalcEntryPoint = "GammaCorrectionWithoutAlphaCalcKernel";
|
||||||
|
|
||||||
|
m_GammaCorrectionWithAlphaCalcKernel = CreateGammaCorrectionKernelString(true);
|
||||||
|
m_GammaCorrectionWithoutAlphaCalcKernel = CreateGammaCorrectionKernelString(false);
|
||||||
|
|
||||||
|
m_FinalAccumEarlyClipEntryPoint = "FinalAccumEarlyClipKernel";
|
||||||
|
m_FinalAccumEarlyClipWithAlphaCalcWithAlphaAccumEntryPoint = "FinalAccumEarlyClipWithAlphaCalcWithAlphaAccumKernel";
|
||||||
|
m_FinalAccumEarlyClipWithoutAlphaCalcWithAlphaAccumEntryPoint = "FinalAccumEarlyClipWithoutAlphaCalcWithAlphaAccumKernel";
|
||||||
|
|
||||||
|
m_FinalAccumEarlyClipKernel = CreateFinalAccumKernelString(true, false, false);
|
||||||
|
m_FinalAccumEarlyClipWithAlphaCalcWithAlphaAccumKernel = CreateFinalAccumKernelString(true, true, true);
|
||||||
|
m_FinalAccumEarlyClipWithoutAlphaCalcWithAlphaAccumKernel = CreateFinalAccumKernelString(true, false, true);
|
||||||
|
|
||||||
|
m_FinalAccumLateClipEntryPoint = "FinalAccumLateClipKernel";
|
||||||
|
m_FinalAccumLateClipWithAlphaCalcWithAlphaAccumEntryPoint = "FinalAccumLateClipWithAlphaCalcWithAlphaAccumKernel";
|
||||||
|
m_FinalAccumLateClipWithoutAlphaCalcWithAlphaAccumEntryPoint = "FinalAccumLateClipWithoutAlphaCalcWithAlphaAccumKernel";
|
||||||
|
|
||||||
|
m_FinalAccumLateClipKernel = CreateFinalAccumKernelString(false, false, false);
|
||||||
|
m_FinalAccumLateClipWithAlphaCalcWithAlphaAccumKernel = CreateFinalAccumKernelString(false, true, true);
|
||||||
|
m_FinalAccumLateClipWithoutAlphaCalcWithAlphaAccumKernel = CreateFinalAccumKernelString(false, false, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Kernel source and entry point properties, getters only.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
template <typename T> string FinalAccumOpenCLKernelCreator<T>::GammaCorrectionWithAlphaCalcKernel() { return m_GammaCorrectionWithAlphaCalcKernel; }
|
||||||
|
template <typename T> string FinalAccumOpenCLKernelCreator<T>::GammaCorrectionWithAlphaCalcEntryPoint() { return m_GammaCorrectionWithAlphaCalcEntryPoint; }
|
||||||
|
template <typename T> string FinalAccumOpenCLKernelCreator<T>::GammaCorrectionWithoutAlphaCalcKernel() { return m_GammaCorrectionWithoutAlphaCalcKernel; }
|
||||||
|
template <typename T> string FinalAccumOpenCLKernelCreator<T>::GammaCorrectionWithoutAlphaCalcEntryPoint() { return m_GammaCorrectionWithoutAlphaCalcEntryPoint; }
|
||||||
|
|
||||||
|
template <typename T> string FinalAccumOpenCLKernelCreator<T>::FinalAccumEarlyClipKernel() { return m_FinalAccumEarlyClipKernel; }
|
||||||
|
template <typename T> string FinalAccumOpenCLKernelCreator<T>::FinalAccumEarlyClipEntryPoint() { return m_FinalAccumEarlyClipEntryPoint; }
|
||||||
|
template <typename T> string FinalAccumOpenCLKernelCreator<T>::FinalAccumEarlyClipWithAlphaCalcWithAlphaAccumKernel() { return m_FinalAccumEarlyClipWithAlphaCalcWithAlphaAccumKernel; }
|
||||||
|
template <typename T> string FinalAccumOpenCLKernelCreator<T>::FinalAccumEarlyClipWithAlphaCalcWithAlphaAccumEntryPoint() { return m_FinalAccumEarlyClipWithAlphaCalcWithAlphaAccumEntryPoint; }
|
||||||
|
template <typename T> string FinalAccumOpenCLKernelCreator<T>::FinalAccumEarlyClipWithoutAlphaCalcWithAlphaAccumKernel() { return m_FinalAccumEarlyClipWithoutAlphaCalcWithAlphaAccumKernel; }
|
||||||
|
template <typename T> string FinalAccumOpenCLKernelCreator<T>::FinalAccumEarlyClipWithoutAlphaCalcWithAlphaAccumEntryPoint() { return m_FinalAccumEarlyClipWithoutAlphaCalcWithAlphaAccumEntryPoint; }
|
||||||
|
|
||||||
|
template <typename T> string FinalAccumOpenCLKernelCreator<T>::FinalAccumLateClipKernel() { return m_FinalAccumLateClipKernel; }
|
||||||
|
template <typename T> string FinalAccumOpenCLKernelCreator<T>::FinalAccumLateClipEntryPoint() { return m_FinalAccumLateClipEntryPoint; }
|
||||||
|
template <typename T> string FinalAccumOpenCLKernelCreator<T>::FinalAccumLateClipWithAlphaCalcWithAlphaAccumKernel() { return m_FinalAccumLateClipWithAlphaCalcWithAlphaAccumKernel; }
|
||||||
|
template <typename T> string FinalAccumOpenCLKernelCreator<T>::FinalAccumLateClipWithAlphaCalcWithAlphaAccumEntryPoint() { return m_FinalAccumLateClipWithAlphaCalcWithAlphaAccumEntryPoint; }
|
||||||
|
template <typename T> string FinalAccumOpenCLKernelCreator<T>::FinalAccumLateClipWithoutAlphaCalcWithAlphaAccumKernel() { return m_FinalAccumLateClipWithoutAlphaCalcWithAlphaAccumKernel; }
|
||||||
|
template <typename T> string FinalAccumOpenCLKernelCreator<T>::FinalAccumLateClipWithoutAlphaCalcWithAlphaAccumEntryPoint() { return m_FinalAccumLateClipWithoutAlphaCalcWithAlphaAccumEntryPoint; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the gamma correction entry point.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="channels">The number of channels used, 3 or 4.</param>
|
||||||
|
/// <param name="transparency">True if channels equals 4 and using transparency, else false.</param>
|
||||||
|
/// <returns>The name of the gamma correction entry point kernel function</returns>
|
||||||
|
template <typename T>
|
||||||
|
string FinalAccumOpenCLKernelCreator<T>::GammaCorrectionEntryPoint(unsigned int channels, bool transparency)
|
||||||
|
{
|
||||||
|
bool alphaCalc = (channels > 3 && transparency);
|
||||||
|
return alphaCalc ? m_GammaCorrectionWithAlphaCalcEntryPoint : m_GammaCorrectionWithoutAlphaCalcEntryPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the gamma correction kernel string.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="channels">The number of channels used, 3 or 4.</param>
|
||||||
|
/// <param name="transparency">True if channels equals 4 and using transparency, else false.</param>
|
||||||
|
/// <returns>The gamma correction kernel string</returns>
|
||||||
|
template <typename T>
|
||||||
|
string FinalAccumOpenCLKernelCreator<T>::GammaCorrectionKernel(unsigned int channels, bool transparency)
|
||||||
|
{
|
||||||
|
bool alphaCalc = (channels > 3 && transparency);
|
||||||
|
return alphaCalc ? m_GammaCorrectionWithAlphaCalcKernel : m_GammaCorrectionWithoutAlphaCalcKernel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the final accumulation entry point.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="earlyClip">True if early clip is desired, else false.</param>
|
||||||
|
/// <param name="channels">The number of channels used, 3 or 4.</param>
|
||||||
|
/// <param name="transparency">True if channels equals 4 and using transparency, else false.</param>
|
||||||
|
/// <param name="alphaBase">Storage for the alpha base value used in the kernel. 0 if transparency is true, else 255.</param>
|
||||||
|
/// <param name="alphaScale">Storage for the alpha scale value used in the kernel. 255 if transparency is true, else 0.</param>
|
||||||
|
/// <returns>The name of the final accumulation entry point kernel function</returns>
|
||||||
|
template <typename T>
|
||||||
|
string FinalAccumOpenCLKernelCreator<T>::FinalAccumEntryPoint(bool earlyClip, unsigned int channels, bool transparency, T& alphaBase, T& alphaScale)
|
||||||
|
{
|
||||||
|
bool alphaCalc = (channels > 3 && transparency);
|
||||||
|
bool alphaAccum = channels > 3;
|
||||||
|
|
||||||
|
if (alphaAccum)
|
||||||
|
{
|
||||||
|
alphaBase = transparency ? 0.0f : 255.0f;//See the table below.
|
||||||
|
alphaScale = transparency ? 255.0f : 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (earlyClip)
|
||||||
|
{
|
||||||
|
if (!alphaCalc && !alphaAccum)//Rgb output, the most common case.
|
||||||
|
return FinalAccumEarlyClipEntryPoint();
|
||||||
|
else if (alphaCalc && alphaAccum)//Rgba output and Transparency.
|
||||||
|
return FinalAccumEarlyClipWithAlphaCalcWithAlphaAccumEntryPoint();
|
||||||
|
else if (!alphaCalc && alphaAccum)//Rgba output and !Transparency.
|
||||||
|
return FinalAccumEarlyClipWithoutAlphaCalcWithAlphaAccumEntryPoint();
|
||||||
|
else
|
||||||
|
return "";//Cannot have alphaCalc and !alphaAccum, it makes no sense.
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!alphaCalc && !alphaAccum)//Rgb output, the most common case.
|
||||||
|
return FinalAccumLateClipEntryPoint();
|
||||||
|
else if (alphaCalc && alphaAccum)//Rgba output and Transparency.
|
||||||
|
return FinalAccumLateClipWithAlphaCalcWithAlphaAccumEntryPoint();
|
||||||
|
else if (!alphaCalc && alphaAccum)//Rgba output and !Transparency.
|
||||||
|
return FinalAccumLateClipWithoutAlphaCalcWithAlphaAccumEntryPoint();
|
||||||
|
else
|
||||||
|
return "";//Cannot have alphaCalc and !alphaAccum, it makes no sense.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the final accumulation kernel string.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="earlyClip">True if early clip is desired, else false.</param>
|
||||||
|
/// <param name="channels">The number of channels used, 3 or 4.</param>
|
||||||
|
/// <param name="transparency">True if channels equals 4 and using transparency, else false.</param>
|
||||||
|
/// <returns>The final accumulation kernel string</returns>
|
||||||
|
template <typename T>
|
||||||
|
string FinalAccumOpenCLKernelCreator<T>::FinalAccumKernel(bool earlyClip, unsigned int channels, bool transparency)
|
||||||
|
{
|
||||||
|
bool alphaCalc = (channels > 3 && transparency);
|
||||||
|
bool alphaAccum = channels > 3;
|
||||||
|
|
||||||
|
if (earlyClip)
|
||||||
|
{
|
||||||
|
if (!alphaCalc && !alphaAccum)//Rgb output, the most common case.
|
||||||
|
return FinalAccumEarlyClipKernel();
|
||||||
|
else if (alphaCalc && alphaAccum)//Rgba output and Transparency.
|
||||||
|
return FinalAccumEarlyClipWithAlphaCalcWithAlphaAccumKernel();
|
||||||
|
else if (!alphaCalc && alphaAccum)//Rgba output and !Transparency.
|
||||||
|
return FinalAccumEarlyClipWithoutAlphaCalcWithAlphaAccumKernel();
|
||||||
|
else
|
||||||
|
return "";//Cannot have alphaCalc and !alphaAccum, it makes no sense.
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!alphaCalc && !alphaAccum)//Rgb output, the most common case.
|
||||||
|
return FinalAccumLateClipKernel();
|
||||||
|
else if (alphaCalc && alphaAccum)//Rgba output and Transparency.
|
||||||
|
return FinalAccumLateClipWithAlphaCalcWithAlphaAccumKernel();
|
||||||
|
else if (!alphaCalc && alphaAccum)//Rgba output and !Transparency.
|
||||||
|
return FinalAccumLateClipWithoutAlphaCalcWithAlphaAccumKernel();
|
||||||
|
else
|
||||||
|
return "";//Cannot have alphaCalc and !alphaAccum, it makes no sense.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Wrapper around CreateFinalAccumKernelString().
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="earlyClip">True if early clip is desired, else false.</param>
|
||||||
|
/// <param name="channels">The number of channels used, 3 or 4.</param>
|
||||||
|
/// <param name="transparency">True if channels equals 4 and using transparency, else false.</param>
|
||||||
|
/// <returns>The final accumulation kernel string</returns>
|
||||||
|
template <typename T>
|
||||||
|
string FinalAccumOpenCLKernelCreator<T>::CreateFinalAccumKernelString(bool earlyClip, unsigned int channels, bool transparency)
|
||||||
|
{
|
||||||
|
return CreateFinalAccumKernelString(earlyClip, (channels > 3 && transparency), channels > 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create the final accumulation kernel string
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="earlyClip">True if early clip is desired, else false.</param>
|
||||||
|
/// <param name="alphaCalc">True if channels equals 4 and transparency is desired, else false.</param>
|
||||||
|
/// <param name="alphaAccum">True if channels equals 4</param>
|
||||||
|
/// <returns>The final accumulation kernel string</returns>
|
||||||
|
template <typename T>
|
||||||
|
string FinalAccumOpenCLKernelCreator<T>::CreateFinalAccumKernelString(bool earlyClip, bool alphaCalc, bool alphaAccum)
|
||||||
|
{
|
||||||
|
ostringstream os;
|
||||||
|
string channels = alphaAccum ? "4" : "3";
|
||||||
|
|
||||||
|
os <<
|
||||||
|
ConstantDefinesString(typeid(T) == typeid(double)) <<
|
||||||
|
ClampRealFunctionString <<
|
||||||
|
UnionCLStructString <<
|
||||||
|
RgbToHsvFunctionString <<
|
||||||
|
HsvToRgbFunctionString <<
|
||||||
|
CalcAlphaFunctionString <<
|
||||||
|
SpatialFilterCLStructString;
|
||||||
|
|
||||||
|
if (earlyClip)
|
||||||
|
{
|
||||||
|
if (!alphaCalc && !alphaAccum)//Rgb output, the most common case.
|
||||||
|
os << "__kernel void " << m_FinalAccumEarlyClipEntryPoint << "(\n";
|
||||||
|
else if (alphaCalc && alphaAccum)//Rgba output and Transparency.
|
||||||
|
os << "__kernel void " << m_FinalAccumEarlyClipWithAlphaCalcWithAlphaAccumEntryPoint << "(\n";
|
||||||
|
else if (!alphaCalc && alphaAccum)//Rgba output and !Transparency.
|
||||||
|
os << "__kernel void " << m_FinalAccumEarlyClipWithoutAlphaCalcWithAlphaAccumEntryPoint << "(\n";
|
||||||
|
else
|
||||||
|
return "";//Cannot have alphaCalc and !alphaAccum, it makes no sense.
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
CreateCalcNewRgbFunctionString(false) <<
|
||||||
|
CreateGammaCorrectionFunctionString(false, alphaCalc, alphaAccum, true);
|
||||||
|
|
||||||
|
if (!alphaCalc && !alphaAccum)//Rgb output, the most common case.
|
||||||
|
os << "__kernel void " << m_FinalAccumLateClipEntryPoint << "(\n";
|
||||||
|
else if (alphaCalc && alphaAccum)//Rgba output and Transparency.
|
||||||
|
os << "__kernel void " << m_FinalAccumLateClipWithAlphaCalcWithAlphaAccumEntryPoint << "(\n";
|
||||||
|
else if (!alphaCalc && alphaAccum)//Rgba output and !Transparency.
|
||||||
|
os << "__kernel void " << m_FinalAccumLateClipWithoutAlphaCalcWithAlphaAccumEntryPoint << "(\n";
|
||||||
|
else
|
||||||
|
return "";//Cannot have alphaCalc and !alphaAccum, it makes no sense.
|
||||||
|
}
|
||||||
|
|
||||||
|
os <<
|
||||||
|
" const __global real4reals* accumulator,\n"
|
||||||
|
" __write_only image2d_t pixels,\n"
|
||||||
|
" __constant SpatialFilterCL* spatialFilter,\n"
|
||||||
|
" __constant real_t* filterCoefs,\n"
|
||||||
|
" const real_t alphaBase,\n"
|
||||||
|
" const real_t alphaScale\n"
|
||||||
|
"\t)\n"
|
||||||
|
"{\n"
|
||||||
|
"\n"
|
||||||
|
" if ((GLOBAL_ID_Y >= spatialFilter->m_FinalRasH) || (GLOBAL_ID_X >= spatialFilter->m_FinalRasW))\n"
|
||||||
|
" return;\n"
|
||||||
|
"\n"
|
||||||
|
" unsigned int accumX = spatialFilter->m_DensityFilterOffset + (GLOBAL_ID_X * spatialFilter->m_Supersample);\n"
|
||||||
|
" unsigned int accumY = spatialFilter->m_DensityFilterOffset + (GLOBAL_ID_Y * spatialFilter->m_Supersample);\n"
|
||||||
|
|
||||||
|
" int2 finalCoord;\n"
|
||||||
|
" finalCoord.x = GLOBAL_ID_X;\n"
|
||||||
|
" finalCoord.y = GLOBAL_ID_Y;\n"
|
||||||
|
" float4floats finalColor;\n"
|
||||||
|
" real_t alpha, ls;\n"
|
||||||
|
" int ii, jj;\n"
|
||||||
|
" unsigned int filterKRowIndex;\n"
|
||||||
|
" const __global real4reals* accumBucket;\n"
|
||||||
|
" real4reals newBucket;\n"
|
||||||
|
" newBucket.m_Real4 = 0;\n"
|
||||||
|
" real4reals newRgb;\n"
|
||||||
|
" newRgb.m_Real4 = 0;\n"
|
||||||
|
"\n"
|
||||||
|
" for (jj = 0; jj < spatialFilter->m_FilterWidth; jj++)\n"
|
||||||
|
" {\n"
|
||||||
|
" filterKRowIndex = jj * spatialFilter->m_FilterWidth;\n"
|
||||||
|
"\n"
|
||||||
|
" for (ii = 0; ii < spatialFilter->m_FilterWidth; ii++)\n"
|
||||||
|
" {\n"
|
||||||
|
" real_t k = filterCoefs[ii + filterKRowIndex];\n"
|
||||||
|
"\n"
|
||||||
|
" accumBucket = accumulator + (accumX + ii) + ((accumY + jj) * spatialFilter->m_SuperRasW);\n"
|
||||||
|
" newBucket.m_Real4 += (k * accumBucket->m_Real4);\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
//Not supporting 2 bytes per channel on the GPU. If the user wants it, run on the CPU.
|
||||||
|
if (earlyClip)//If early clip, simply assign values directly to the temp uint4 since they've been gamma corrected already, then write it straight to the output image below.
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" finalColor.m_Float4.x = (float)newBucket.m_Real4.x;\n"//CPU side clamps, skip here because write_imagef() does the clamping for us.
|
||||||
|
" finalColor.m_Float4.y = (float)newBucket.m_Real4.y;\n"
|
||||||
|
" finalColor.m_Float4.z = (float)newBucket.m_Real4.z;\n";
|
||||||
|
|
||||||
|
if (alphaAccum)
|
||||||
|
{
|
||||||
|
if (alphaCalc)
|
||||||
|
os << " finalColor.m_Float4.w = (float)newBucket.m_Real4.w * 255.0f;\n";
|
||||||
|
else
|
||||||
|
os << " finalColor.m_Float4.w = 255;\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Late clip, so must gamma correct from the temp new bucket to temp float4.
|
||||||
|
if (typeid(T) == typeid(double))
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" real4reals realFinal;\n"
|
||||||
|
"\n"
|
||||||
|
" GammaCorrectionFloats(&newBucket, &(spatialFilter->m_Background[0]), spatialFilter->m_Gamma, spatialFilter->m_LinRange, spatialFilter->m_Vibrancy, spatialFilter->m_HighlightPower, alphaBase, alphaScale, &(realFinal.m_Reals[0]));\n"
|
||||||
|
" finalColor.m_Float4.x = (float)realFinal.m_Real4.x;\n"
|
||||||
|
" finalColor.m_Float4.y = (float)realFinal.m_Real4.y;\n"
|
||||||
|
" finalColor.m_Float4.z = (float)realFinal.m_Real4.z;\n"
|
||||||
|
" finalColor.m_Float4.w = (float)realFinal.m_Real4.w;\n"
|
||||||
|
;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" GammaCorrectionFloats(&newBucket, &(spatialFilter->m_Background[0]), spatialFilter->m_Gamma, spatialFilter->m_LinRange, spatialFilter->m_Vibrancy, spatialFilter->m_HighlightPower, alphaBase, alphaScale, &(finalColor.m_Floats[0]));\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
os <<
|
||||||
|
" finalColor.m_Float4 /= 255.0f;\n"
|
||||||
|
" write_imagef(pixels, finalCoord, finalColor.m_Float4);\n"//Use write_imagef instead of write_imageui because only the former works when sharing with an OpenGL texture.
|
||||||
|
" barrier(CLK_GLOBAL_MEM_FENCE);\n"//Required, or else page tearing will occur during interactive rendering.
|
||||||
|
"}\n"
|
||||||
|
;
|
||||||
|
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates the gamma correction function string.
|
||||||
|
/// This is not a full kernel, just a function that is used in the kernels.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="globalBucket">True if writing to a global buffer (early clip), else false (late clip).</param>
|
||||||
|
/// <param name="alphaCalc">True if channels equals 4 and transparency is desired, else false.</param>
|
||||||
|
/// <param name="alphaAccum">True if channels equals 4</param>
|
||||||
|
/// <param name="finalOut">True if writing to global buffer (late clip), else false (early clip).</param>
|
||||||
|
/// <returns>The gamma correction function string</returns>
|
||||||
|
template <typename T>
|
||||||
|
string FinalAccumOpenCLKernelCreator<T>::CreateGammaCorrectionFunctionString(bool globalBucket, bool alphaCalc, bool alphaAccum, bool finalOut)
|
||||||
|
{
|
||||||
|
ostringstream os;
|
||||||
|
string dataType;
|
||||||
|
string unionMember;
|
||||||
|
dataType = "real_t";
|
||||||
|
|
||||||
|
//Use real_t for all cases, early clip and final accum.
|
||||||
|
os << "void GammaCorrectionFloats(" << (globalBucket ? "__global " : "") << "real4reals* bucket, __constant real_t* background, real_t g, real_t linRange, real_t vibrancy, real_t highlightPower, real_t alphaBase, real_t alphaScale, " << (finalOut ? "" : "__global") << " real_t* correctedChannels)\n";
|
||||||
|
|
||||||
|
os
|
||||||
|
<< "{\n"
|
||||||
|
<< " real_t alpha, ls, tmp, a;\n"
|
||||||
|
<< " real4reals newRgb;\n"
|
||||||
|
<< "\n"
|
||||||
|
<< " if (bucket->m_Reals[3] <= 0)\n"
|
||||||
|
<< " {\n"
|
||||||
|
<< " alpha = 0;\n"
|
||||||
|
<< " ls = 0;\n"
|
||||||
|
<< " }\n"
|
||||||
|
<< " else\n"
|
||||||
|
<< " {\n"
|
||||||
|
<< " tmp = bucket->m_Reals[3];\n"
|
||||||
|
<< " alpha = CalcAlpha(tmp, g, linRange);\n"
|
||||||
|
<< " ls = vibrancy * 256.0 * alpha / tmp;\n"
|
||||||
|
<< " ClampRef(&alpha, 0.0, 1.0);\n"
|
||||||
|
<< " }\n"
|
||||||
|
<< "\n"
|
||||||
|
<< " CalcNewRgb(bucket, ls, highlightPower, &newRgb);\n"
|
||||||
|
<< "\n"
|
||||||
|
<< " for (unsigned int rgbi = 0; rgbi < 3; rgbi++)\n"
|
||||||
|
<< " {\n"
|
||||||
|
<< " a = newRgb.m_Reals[rgbi] + ((1.0 - vibrancy) * 256.0 * pow(bucket->m_Reals[rgbi], g));\n"
|
||||||
|
<< "\n";
|
||||||
|
|
||||||
|
if (!alphaCalc)
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" a += ((1.0 - alpha) * background[rgbi]);\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
os
|
||||||
|
<< " if (alpha > 0)\n"
|
||||||
|
<< " a /= alpha;\n"
|
||||||
|
<< " else\n"
|
||||||
|
<< " a = 0;\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
os <<
|
||||||
|
"\n"
|
||||||
|
" correctedChannels[rgbi] = (" << dataType << ")clamp(a, 0.0, 255.0);\n"
|
||||||
|
" }\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
//The CPU code has 3 cases for assigning alpha:
|
||||||
|
//[3] = alpha.//Early clip.
|
||||||
|
//[3] = alpha * 255.//Final Rgba with transparency.
|
||||||
|
//[3] = 255.//Final Rgba without transparency.
|
||||||
|
//Putting conditionals in GPU code is to be avoided. So do base + alpha * scale which will
|
||||||
|
//work for all 3 cases without using a conditional, which should be faster on a GPU. This gives:
|
||||||
|
//Base = 0, scale = 1. [3] = (0 + (alpha * 1)). [3] = alpha.
|
||||||
|
//Base = 0, scale = 255. [3] = (0 + (alpha * 255)). [3] = alpha * 255.
|
||||||
|
//Base = 255, scale = 0. [3] = (255 + (alpha * 0)). [3] = 255.
|
||||||
|
if (alphaAccum)
|
||||||
|
{
|
||||||
|
os
|
||||||
|
<< " correctedChannels[3] = (" << dataType << ")(alphaBase + (alpha * alphaScale));\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
os <<
|
||||||
|
"}\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// OpenCL equivalent of Palette::CalcNewRgb().
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="globalBucket">True if writing the corrected value to a global buffer (early clip), else false (late clip).</param>
|
||||||
|
/// <returns>The CalcNewRgb function string</returns>
|
||||||
|
template <typename T>
|
||||||
|
string FinalAccumOpenCLKernelCreator<T>::CreateCalcNewRgbFunctionString(bool globalBucket)
|
||||||
|
{
|
||||||
|
ostringstream os;
|
||||||
|
|
||||||
|
os <<
|
||||||
|
"static void CalcNewRgb(" << (globalBucket ? "__global " : "") << "real4reals* oldRgb, real_t ls, real_t highPow, real4reals* newRgb)\n"
|
||||||
|
"{\n"
|
||||||
|
" int rgbi;\n"
|
||||||
|
" real_t newls, lsratio;\n"
|
||||||
|
" real4reals newHsv;\n"
|
||||||
|
" real_t maxa, maxc;\n"
|
||||||
|
" real_t adjhlp;\n"
|
||||||
|
"\n"
|
||||||
|
" if (ls == 0 || (oldRgb->m_Real4.x == 0 && oldRgb->m_Real4.y == 0 && oldRgb->m_Real4.z == 0))\n"//Can't do a vector compare to zero.
|
||||||
|
" {\n"
|
||||||
|
" newRgb->m_Real4 = 0;\n"
|
||||||
|
" return;\n"
|
||||||
|
" }\n"
|
||||||
|
"\n"
|
||||||
|
//Identify the most saturated channel.
|
||||||
|
" maxc = max(max(oldRgb->m_Reals[0], oldRgb->m_Reals[1]), oldRgb->m_Reals[2]);\n"
|
||||||
|
" maxa = ls * maxc;\n"
|
||||||
|
"\n"
|
||||||
|
//If a channel is saturated and highlight power is non-negative
|
||||||
|
//modify the color to prevent hue shift.
|
||||||
|
" if (maxa > 255 && highPow >= 0)\n"
|
||||||
|
" {\n"
|
||||||
|
" newls = 255.0 / maxc;\n"
|
||||||
|
" lsratio = pow(newls / ls, highPow);\n"
|
||||||
|
"\n"
|
||||||
|
//Calculate the max-value color (ranged 0 - 1).
|
||||||
|
" for (rgbi = 0; rgbi < 3; rgbi++)\n"
|
||||||
|
" newRgb->m_Reals[rgbi] = newls * oldRgb->m_Reals[rgbi] / 255.0;\n"
|
||||||
|
"\n"
|
||||||
|
//Reduce saturation by the lsratio.
|
||||||
|
" RgbToHsv(&(newRgb->m_Real4), &(newHsv.m_Real4));\n"
|
||||||
|
" newHsv.m_Real4.y *= lsratio;\n"
|
||||||
|
" HsvToRgb(&(newHsv.m_Real4), &(newRgb->m_Real4));\n"
|
||||||
|
"\n"
|
||||||
|
" for (rgbi = 0; rgbi < 3; rgbi++)\n"//Unrolling and vectorizing makes no difference.
|
||||||
|
" newRgb->m_Reals[rgbi] *= 255.0;\n"
|
||||||
|
" }\n"
|
||||||
|
" else\n"
|
||||||
|
" {\n"
|
||||||
|
" newls = 255.0 / maxc;\n"
|
||||||
|
" adjhlp = -highPow;\n"
|
||||||
|
"\n"
|
||||||
|
" if (adjhlp > 1)\n"
|
||||||
|
" adjhlp = 1;\n"
|
||||||
|
"\n"
|
||||||
|
" if (maxa <= 255)\n"
|
||||||
|
" adjhlp = 1;\n"
|
||||||
|
"\n"
|
||||||
|
//Calculate the max-value color (ranged 0 - 1) interpolated with the old behavior.
|
||||||
|
" for (rgbi = 0; rgbi < 3; rgbi++)\n"//Unrolling, caching and vectorizing makes no difference.
|
||||||
|
" newRgb->m_Reals[rgbi] = ((1.0 - adjhlp) * newls + adjhlp * ls) * oldRgb->m_Reals[rgbi];\n"
|
||||||
|
" }\n"
|
||||||
|
"}\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create the gamma correction kernel string used for early clipping.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="alphaCalc">True if channels equals 4 and transparency is desired, else false.</param>
|
||||||
|
/// <returns>The gamma correction kernel string used for early clipping</returns>
|
||||||
|
template <typename T>
|
||||||
|
string FinalAccumOpenCLKernelCreator<T>::CreateGammaCorrectionKernelString(bool alphaCalc)
|
||||||
|
{
|
||||||
|
ostringstream os;
|
||||||
|
string dataType;
|
||||||
|
|
||||||
|
os <<
|
||||||
|
ConstantDefinesString(typeid(T) == typeid(double)) <<
|
||||||
|
ClampRealFunctionString <<
|
||||||
|
UnionCLStructString <<
|
||||||
|
RgbToHsvFunctionString <<
|
||||||
|
HsvToRgbFunctionString <<
|
||||||
|
CalcAlphaFunctionString <<
|
||||||
|
CreateCalcNewRgbFunctionString(true) <<
|
||||||
|
SpatialFilterCLStructString <<
|
||||||
|
CreateGammaCorrectionFunctionString(true, alphaCalc, true, false);//Will only be used with float in this case, early clip. Will always alpha accum.
|
||||||
|
|
||||||
|
os << "__kernel void " << (alphaCalc ? m_GammaCorrectionWithAlphaCalcEntryPoint : m_GammaCorrectionWithoutAlphaCalcEntryPoint) << "(\n" <<
|
||||||
|
" __global real4reals* accumulator,\n"
|
||||||
|
" __constant SpatialFilterCL* spatialFilter\n"
|
||||||
|
")\n"
|
||||||
|
"{\n"
|
||||||
|
" int testGutter = 0;\n"
|
||||||
|
"\n"
|
||||||
|
" if (GLOBAL_ID_Y >= (spatialFilter->m_SuperRasH - testGutter) || GLOBAL_ID_X >= (spatialFilter->m_SuperRasW - testGutter))\n"
|
||||||
|
" return;\n"
|
||||||
|
"\n"
|
||||||
|
" unsigned int superIndex = (GLOBAL_ID_Y * spatialFilter->m_SuperRasW) + GLOBAL_ID_X;\n"
|
||||||
|
" __global real4reals* bucket = accumulator + superIndex;\n"
|
||||||
|
//Pass in an alphaBase and alphaScale of 0, 1 which means to just directly assign the computed alpha value.
|
||||||
|
" GammaCorrectionFloats(bucket, &(spatialFilter->m_Background[0]), spatialFilter->m_Gamma, spatialFilter->m_LinRange, spatialFilter->m_Vibrancy, spatialFilter->m_HighlightPower, 0.0, 1.0, &(bucket->m_Reals[0]));\n"
|
||||||
|
"}\n"
|
||||||
|
;
|
||||||
|
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
}
|
87
Source/EmberCL/FinalAccumOpenCLKernelCreator.h
Normal file
87
Source/EmberCL/FinalAccumOpenCLKernelCreator.h
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "EmberCLPch.h"
|
||||||
|
#include "EmberCLStructs.h"
|
||||||
|
#include "EmberCLFunctions.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// FinalAccumOpenCLKernelCreator class.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberCLns
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Class for creating the final accumulation code in OpenCL.
|
||||||
|
/// There are many conditionals in the CPU code to create the
|
||||||
|
/// final output image. This class creates many different kernels
|
||||||
|
/// with all conditionals and unnecessary calculations stripped out.
|
||||||
|
/// The conditionals are:
|
||||||
|
/// Early clip/late clip
|
||||||
|
/// Alpha channel, no alpha channel
|
||||||
|
/// Alpha with/without transparency
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBERCL_API FinalAccumOpenCLKernelCreator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FinalAccumOpenCLKernelCreator();
|
||||||
|
|
||||||
|
string GammaCorrectionWithAlphaCalcKernel();
|
||||||
|
string GammaCorrectionWithAlphaCalcEntryPoint();
|
||||||
|
|
||||||
|
string GammaCorrectionWithoutAlphaCalcKernel();
|
||||||
|
string GammaCorrectionWithoutAlphaCalcEntryPoint();
|
||||||
|
|
||||||
|
string FinalAccumEarlyClipKernel();
|
||||||
|
string FinalAccumEarlyClipEntryPoint();
|
||||||
|
string FinalAccumEarlyClipWithAlphaCalcWithAlphaAccumKernel();
|
||||||
|
string FinalAccumEarlyClipWithAlphaCalcWithAlphaAccumEntryPoint();
|
||||||
|
string FinalAccumEarlyClipWithoutAlphaCalcWithAlphaAccumKernel();
|
||||||
|
string FinalAccumEarlyClipWithoutAlphaCalcWithAlphaAccumEntryPoint();
|
||||||
|
|
||||||
|
string FinalAccumLateClipKernel();
|
||||||
|
string FinalAccumLateClipEntryPoint();
|
||||||
|
string FinalAccumLateClipWithAlphaCalcWithAlphaAccumKernel();
|
||||||
|
string FinalAccumLateClipWithAlphaCalcWithAlphaAccumEntryPoint();
|
||||||
|
string FinalAccumLateClipWithoutAlphaCalcWithAlphaAccumKernel();
|
||||||
|
string FinalAccumLateClipWithoutAlphaCalcWithAlphaAccumEntryPoint();
|
||||||
|
string GammaCorrectionEntryPoint(unsigned int channels, bool transparency);
|
||||||
|
string GammaCorrectionKernel(unsigned int channels, bool transparency);
|
||||||
|
string FinalAccumEntryPoint(bool earlyClip, unsigned int channels, bool transparency, T& alphaBase, T& alphaScale);
|
||||||
|
string FinalAccumKernel(bool earlyClip, unsigned int channels, bool transparency);
|
||||||
|
|
||||||
|
private:
|
||||||
|
string CreateFinalAccumKernelString(bool earlyClip, unsigned int channels, bool transparency);
|
||||||
|
string CreateGammaCorrectionKernelString(bool alphaCalc);
|
||||||
|
|
||||||
|
string CreateFinalAccumKernelString(bool earlyClip, bool alphaCalc, bool alphaAccum);
|
||||||
|
string CreateGammaCorrectionFunctionString(bool globalBucket, bool alphaCalc, bool alphaAccum, bool finalOut);
|
||||||
|
string CreateCalcNewRgbFunctionString(bool globalBucket);
|
||||||
|
string m_GammaCorrectionWithAlphaCalcKernel;
|
||||||
|
string m_GammaCorrectionWithAlphaCalcEntryPoint;
|
||||||
|
|
||||||
|
string m_GammaCorrectionWithoutAlphaCalcKernel;
|
||||||
|
string m_GammaCorrectionWithoutAlphaCalcEntryPoint;
|
||||||
|
|
||||||
|
string m_FinalAccumEarlyClipKernel;//False, false.
|
||||||
|
string m_FinalAccumEarlyClipEntryPoint;
|
||||||
|
string m_FinalAccumEarlyClipWithAlphaCalcWithAlphaAccumKernel;//True, true.
|
||||||
|
string m_FinalAccumEarlyClipWithAlphaCalcWithAlphaAccumEntryPoint;
|
||||||
|
string m_FinalAccumEarlyClipWithoutAlphaCalcWithAlphaAccumKernel;//False, true.
|
||||||
|
string m_FinalAccumEarlyClipWithoutAlphaCalcWithAlphaAccumEntryPoint;
|
||||||
|
|
||||||
|
string m_FinalAccumLateClipKernel;//False, false.
|
||||||
|
string m_FinalAccumLateClipEntryPoint;
|
||||||
|
string m_FinalAccumLateClipWithAlphaCalcWithAlphaAccumKernel;//True, true.
|
||||||
|
string m_FinalAccumLateClipWithAlphaCalcWithAlphaAccumEntryPoint;
|
||||||
|
string m_FinalAccumLateClipWithoutAlphaCalcWithAlphaAccumKernel;//False, true.
|
||||||
|
string m_FinalAccumLateClipWithoutAlphaCalcWithAlphaAccumEntryPoint;
|
||||||
|
};
|
||||||
|
|
||||||
|
template EMBERCL_API class FinalAccumOpenCLKernelCreator<float>;
|
||||||
|
|
||||||
|
#ifdef DO_DOUBLE
|
||||||
|
template EMBERCL_API class FinalAccumOpenCLKernelCreator<double>;
|
||||||
|
#endif
|
||||||
|
}
|
785
Source/EmberCL/IterOpenCLKernelCreator.cpp
Normal file
785
Source/EmberCL/IterOpenCLKernelCreator.cpp
Normal file
@ -0,0 +1,785 @@
|
|||||||
|
#include "EmberCLPch.h"
|
||||||
|
#include "IterOpenCLKernelCreator.h"
|
||||||
|
|
||||||
|
namespace EmberCLns
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Empty constructor that does nothing. The user must call the one which takes a bool
|
||||||
|
/// argument before using this class.
|
||||||
|
/// This constructor only exists so the class can be a member of a class.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
IterOpenCLKernelCreator<T>::IterOpenCLKernelCreator()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor that sets up some basic entry point strings and creates
|
||||||
|
/// the zeroization kernel string since it requires no conditional inputs.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
IterOpenCLKernelCreator<T>::IterOpenCLKernelCreator(bool nVidia)
|
||||||
|
{
|
||||||
|
m_NVidia = nVidia;
|
||||||
|
m_IterEntryPoint = "IterateKernel";
|
||||||
|
m_ZeroizeEntryPoint = "ZeroizeKernel";
|
||||||
|
m_ZeroizeKernel = CreateZeroizeKernelString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Accessors.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
template <typename T> string IterOpenCLKernelCreator<T>::ZeroizeKernel() { return m_ZeroizeKernel; }
|
||||||
|
template <typename T> string IterOpenCLKernelCreator<T>::ZeroizeEntryPoint() { return m_ZeroizeEntryPoint; }
|
||||||
|
template <typename T> string IterOpenCLKernelCreator<T>::IterEntryPoint() { return m_IterEntryPoint; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create the iteration kernel string using the Cuburn method.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ember">The ember to create the kernel string for</param>
|
||||||
|
/// <param name="params">The parametric variation #define string</param>
|
||||||
|
/// <param name="doAccum">Debugging parameter to include or omit accumulating to the histogram. Default: true.</param>
|
||||||
|
/// <returns>The kernel string</returns>
|
||||||
|
template <typename T>
|
||||||
|
string IterOpenCLKernelCreator<T>::CreateIterKernelString(Ember<T>& ember, string& parVarDefines, bool lockAccum, bool doAccum)
|
||||||
|
{
|
||||||
|
bool doublePrecision = typeid(T) == typeid(double);
|
||||||
|
unsigned int i, v, varIndex, varCount, totalXformCount = ember.TotalXformCount();
|
||||||
|
ostringstream kernelIterBody, xformFuncs, os;
|
||||||
|
vector<Variation<T>*> variations;
|
||||||
|
|
||||||
|
xformFuncs << "\n" << parVarDefines << endl;
|
||||||
|
ember.GetPresentVariations(variations);
|
||||||
|
std::for_each(variations.begin(), variations.end(), [&](Variation<T>* var) { if (var) xformFuncs << var->OpenCLFuncsString(); });
|
||||||
|
|
||||||
|
for (i = 0; i < totalXformCount; i++)
|
||||||
|
{
|
||||||
|
Xform<T>* xform = ember.GetTotalXform(i);
|
||||||
|
unsigned int totalVarCount = xform->TotalVariationCount();
|
||||||
|
bool needPrecalcSumSquares = false;
|
||||||
|
bool needPrecalcSqrtSumSquares = false;
|
||||||
|
bool needPrecalcAngles = false;
|
||||||
|
bool needPrecalcAtanXY = false;
|
||||||
|
bool needPrecalcAtanYX = false;
|
||||||
|
|
||||||
|
v = varIndex = varCount = 0;
|
||||||
|
xformFuncs <<
|
||||||
|
"void Xform" << i << "(__constant XformCL* xform, __constant real_t* parVars, Point* inPoint, Point* outPoint, uint2* mwc)\n" <<
|
||||||
|
"{\n"
|
||||||
|
" real_t transX, transY, transZ;\n"
|
||||||
|
" real4 vIn, vOut = 0.0;\n";
|
||||||
|
|
||||||
|
//Determine if any variations, regular, pre, or post need precalcs.
|
||||||
|
while (Variation<T>* var = xform->GetVariation(v++))
|
||||||
|
{
|
||||||
|
needPrecalcSumSquares |= var->NeedPrecalcSumSquares();
|
||||||
|
needPrecalcSqrtSumSquares |= var->NeedPrecalcSqrtSumSquares();
|
||||||
|
needPrecalcAngles |= var->NeedPrecalcAngles();
|
||||||
|
needPrecalcAtanXY |= var->NeedPrecalcAtanXY();
|
||||||
|
needPrecalcAtanYX |= var->NeedPrecalcAtanYX();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needPrecalcSumSquares)
|
||||||
|
xformFuncs << "\treal_t precalcSumSquares;\n";
|
||||||
|
|
||||||
|
if (needPrecalcSqrtSumSquares)
|
||||||
|
xformFuncs << "\treal_t precalcSqrtSumSquares;\n";
|
||||||
|
|
||||||
|
if (needPrecalcAngles)
|
||||||
|
{
|
||||||
|
xformFuncs << "\treal_t precalcSina;\n";
|
||||||
|
xformFuncs << "\treal_t precalcCosa;\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needPrecalcAtanXY)
|
||||||
|
xformFuncs << "\treal_t precalcAtanxy;\n";
|
||||||
|
|
||||||
|
if (needPrecalcAtanYX)
|
||||||
|
xformFuncs << "\treal_t precalcAtanyx;\n";
|
||||||
|
|
||||||
|
xformFuncs << "\treal_t tempColor = outPoint->m_ColorX = xform->m_ColorSpeedCache + (xform->m_OneMinusColorCache * inPoint->m_ColorX);\n";
|
||||||
|
|
||||||
|
if (xform->PreVariationCount() + xform->VariationCount() == 0)
|
||||||
|
{
|
||||||
|
xformFuncs <<
|
||||||
|
" outPoint->m_X = (xform->m_A * inPoint->m_X) + (xform->m_B * inPoint->m_Y) + xform->m_C;\n" <<
|
||||||
|
" outPoint->m_Y = (xform->m_D * inPoint->m_X) + (xform->m_E * inPoint->m_Y) + xform->m_F;\n" <<
|
||||||
|
" outPoint->m_Z = inPoint->m_Z;\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xformFuncs <<
|
||||||
|
" transX = (xform->m_A * inPoint->m_X) + (xform->m_B * inPoint->m_Y) + xform->m_C;\n" <<
|
||||||
|
" transY = (xform->m_D * inPoint->m_X) + (xform->m_E * inPoint->m_Y) + xform->m_F;\n" <<
|
||||||
|
" transZ = inPoint->m_Z;\n";
|
||||||
|
|
||||||
|
varCount = xform->PreVariationCount();
|
||||||
|
|
||||||
|
if (varCount > 0)
|
||||||
|
{
|
||||||
|
xformFuncs << "\n\t//Apply each of the " << varCount << " pre variations in this xform.\n";
|
||||||
|
|
||||||
|
//Output the code for each pre variation in this xform.
|
||||||
|
for (varIndex = 0; varIndex < varCount; varIndex++)
|
||||||
|
{
|
||||||
|
if (Variation<T>* var = xform->GetVariation(varIndex))
|
||||||
|
{
|
||||||
|
xformFuncs << "\n\t//" << var->Name() << ".\n";
|
||||||
|
xformFuncs << var->PrecalcOpenCLString();
|
||||||
|
xformFuncs << xform->ReadOpenCLString(VARTYPE_PRE) << endl;
|
||||||
|
xformFuncs << var->OpenCLString() << endl;
|
||||||
|
xformFuncs << xform->WriteOpenCLString(VARTYPE_PRE, var->AssignType()) << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xform->VariationCount() > 0)
|
||||||
|
{
|
||||||
|
if (xform->NeedPrecalcSumSquares())
|
||||||
|
xformFuncs << "\tprecalcSumSquares = SQR(transX) + SQR(transY);\n";
|
||||||
|
|
||||||
|
if (xform->NeedPrecalcSqrtSumSquares())
|
||||||
|
xformFuncs << "\tprecalcSqrtSumSquares = sqrt(precalcSumSquares);\n";
|
||||||
|
|
||||||
|
if (xform->NeedPrecalcAngles())
|
||||||
|
{
|
||||||
|
xformFuncs << "\tprecalcSina = transX / precalcSqrtSumSquares;\n";
|
||||||
|
xformFuncs << "\tprecalcCosa = transY / precalcSqrtSumSquares;\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xform->NeedPrecalcAtanXY())
|
||||||
|
xformFuncs << "\tprecalcAtanxy = atan2(transX, transY);\n";
|
||||||
|
|
||||||
|
if (xform->NeedPrecalcAtanYX())
|
||||||
|
xformFuncs << "\tprecalcAtanyx = atan2(transY, transX);\n";
|
||||||
|
|
||||||
|
xformFuncs << "\n\toutPoint->m_X = 0;";
|
||||||
|
xformFuncs << "\n\toutPoint->m_Y = 0;";
|
||||||
|
xformFuncs << "\n\toutPoint->m_Z = 0;\n";
|
||||||
|
xformFuncs << "\n\t//Apply each of the " << xform->VariationCount() << " regular variations in this xform.\n\n";
|
||||||
|
xformFuncs << xform->ReadOpenCLString(VARTYPE_REG);
|
||||||
|
|
||||||
|
varCount += xform->VariationCount();
|
||||||
|
|
||||||
|
//Output the code for each regular variation in this xform.
|
||||||
|
for (; varIndex < varCount; varIndex++)
|
||||||
|
{
|
||||||
|
if (Variation<T>* var = xform->GetVariation(varIndex))
|
||||||
|
{
|
||||||
|
xformFuncs << "\n\t//" << var->Name() << ".\n"
|
||||||
|
<< var->OpenCLString() << (varIndex == varCount - 1 ? "\n" : "\n\n")
|
||||||
|
<< xform->WriteOpenCLString(VARTYPE_REG, ASSIGNTYPE_SUM);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xformFuncs <<
|
||||||
|
" outPoint->m_X = transX;\n"
|
||||||
|
" outPoint->m_Y = transY;\n"
|
||||||
|
" outPoint->m_Z = transZ;\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xform->PostVariationCount() > 0)
|
||||||
|
{
|
||||||
|
varCount += xform->PostVariationCount();
|
||||||
|
xformFuncs << "\n\t//Apply each of the " << xform->PostVariationCount() << " post variations in this xform.\n";
|
||||||
|
|
||||||
|
//Output the code for each post variation in this xform.
|
||||||
|
for (; varIndex < varCount; varIndex++)
|
||||||
|
{
|
||||||
|
if (Variation<T>* var = xform->GetVariation(varIndex))
|
||||||
|
{
|
||||||
|
xformFuncs << "\n\t//" << var->Name() << ".\n";
|
||||||
|
xformFuncs << var->PrecalcOpenCLString();
|
||||||
|
xformFuncs << xform->ReadOpenCLString(VARTYPE_POST) << endl;
|
||||||
|
xformFuncs << var->OpenCLString() << endl;
|
||||||
|
xformFuncs << xform->WriteOpenCLString(VARTYPE_POST, var->AssignType()) << (varIndex == varCount - 1 ? "\n" : "\n\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xform->HasPost())
|
||||||
|
{
|
||||||
|
xformFuncs <<
|
||||||
|
"\n\t//Apply post affine transform.\n"
|
||||||
|
"\treal_t tempX = outPoint->m_X;\n"
|
||||||
|
"\n"
|
||||||
|
"\toutPoint->m_X = (xform->m_PostA * tempX) + (xform->m_PostB * outPoint->m_Y) + xform->m_PostC;\n" <<
|
||||||
|
"\toutPoint->m_Y = (xform->m_PostD * tempX) + (xform->m_PostE * outPoint->m_Y) + xform->m_PostF;\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
xformFuncs << "\toutPoint->m_ColorX = outPoint->m_ColorX + xform->m_DirectColor * (tempColor - outPoint->m_ColorX);\n";
|
||||||
|
xformFuncs << "}\n"
|
||||||
|
<< "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
os <<
|
||||||
|
ConstantDefinesString(doublePrecision) <<
|
||||||
|
InlineMathFunctionsString <<
|
||||||
|
ClampRealFunctionString <<
|
||||||
|
RandFunctionString <<
|
||||||
|
PointCLStructString <<
|
||||||
|
XformCLStructString <<
|
||||||
|
EmberCLStructString <<
|
||||||
|
UnionCLStructString <<
|
||||||
|
CarToRasCLStructString <<
|
||||||
|
CarToRasFunctionString <<
|
||||||
|
AtomicString(doublePrecision, m_NVidia) <<
|
||||||
|
xformFuncs.str() <<
|
||||||
|
"__kernel void " << m_IterEntryPoint << "(\n" <<
|
||||||
|
" uint iterCount,\n"
|
||||||
|
" uint fuseCount,\n"
|
||||||
|
" uint seed,\n"
|
||||||
|
" __constant EmberCL* ember,\n"
|
||||||
|
" __constant real_t* parVars,\n"
|
||||||
|
" __global uchar* xformDistributions,\n"//Using uchar is quicker than uint. Can't be constant because the size can be too large to fit when using xaos.//FINALOPT
|
||||||
|
" __constant CarToRasCL* carToRas,\n"
|
||||||
|
" __global real4reals* histogram,\n"
|
||||||
|
" uint histSize,\n"
|
||||||
|
" __read_only image2d_t palette,\n"
|
||||||
|
" __global Point* points\n"
|
||||||
|
"\t)\n"
|
||||||
|
"{\n"
|
||||||
|
" bool fuse, ok;\n"
|
||||||
|
" uint threadIndex = INDEX_IN_BLOCK_2D;\n"
|
||||||
|
" uint i, itersToDo;\n"
|
||||||
|
" uint consec = 0;\n"
|
||||||
|
//" int badvals = 0;\n"
|
||||||
|
" uint histIndex;\n"
|
||||||
|
" real_t p00, p01;\n"
|
||||||
|
" Point firstPoint, secondPoint, tempPoint;\n"
|
||||||
|
" uint2 mwc;\n"
|
||||||
|
" float4 palColor1;\n"
|
||||||
|
" int2 iPaletteCoord;\n"
|
||||||
|
" const sampler_t paletteSampler = CLK_NORMALIZED_COORDS_FALSE |\n"//Coords from 0 to 255.
|
||||||
|
" CLK_ADDRESS_CLAMP_TO_EDGE |\n"//Clamp to edge
|
||||||
|
" CLK_FILTER_NEAREST;\n"//Don't interpolate
|
||||||
|
" uint threadXY = (THREAD_ID_X + THREAD_ID_Y);\n"
|
||||||
|
" uint threadXDivRows = (THREAD_ID_X / (NTHREADS / THREADS_PER_WARP));\n"
|
||||||
|
" uint threadsMinus1 = NTHREADS - 1;\n"
|
||||||
|
;
|
||||||
|
|
||||||
|
os <<
|
||||||
|
"\n"
|
||||||
|
" __local Point swap[NTHREADS];\n"
|
||||||
|
" __local uint xfsel[NWARPS];\n"
|
||||||
|
"\n"
|
||||||
|
" unsigned int pointsIndex = INDEX_IN_GRID_2D;\n"
|
||||||
|
" mwc.x = (pointsIndex + 1 * seed) & 0x7FFFFFFF;\n"
|
||||||
|
" mwc.y = ((BLOCK_ID_X + 1) + (pointsIndex + 1) * seed) & 0x7FFFFFFF;\n"
|
||||||
|
" iPaletteCoord.y = 0;\n"
|
||||||
|
"\n"
|
||||||
|
" if (fuseCount > 0)\n"
|
||||||
|
" {\n"
|
||||||
|
" fuse = true;\n"
|
||||||
|
" itersToDo = fuseCount;\n"
|
||||||
|
" firstPoint.m_X = MwcNextNeg1Pos1(&mwc);\n"
|
||||||
|
" firstPoint.m_Y = MwcNextNeg1Pos1(&mwc);\n"
|
||||||
|
" firstPoint.m_Z = 0.0;\n"
|
||||||
|
" firstPoint.m_ColorX = MwcNext01(&mwc);\n"
|
||||||
|
" firstPoint.m_LastXfUsed = 0;\n"
|
||||||
|
" }\n"
|
||||||
|
" else\n"
|
||||||
|
" {\n"
|
||||||
|
" fuse = false;\n"
|
||||||
|
" itersToDo = iterCount;\n"
|
||||||
|
" firstPoint = points[pointsIndex];\n"
|
||||||
|
" }\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
//This is done once initially here and then again after each swap-sync in the main loop.
|
||||||
|
//This along with the randomness that the point shuffle provides gives sufficient randomness
|
||||||
|
//to produce results identical to those produced on the CPU.
|
||||||
|
os <<
|
||||||
|
" if (THREAD_ID_Y == 0 && THREAD_ID_X < NWARPS)\n"
|
||||||
|
" xfsel[THREAD_ID_X] = MwcNext(&mwc) % " << CHOOSE_XFORM_GRAIN << ";\n"//It's faster to do the % here ahead of time than every time an xform is looked up to use inside the loop.
|
||||||
|
"\n"
|
||||||
|
" barrier(CLK_LOCAL_MEM_FENCE);\n"
|
||||||
|
"\n"
|
||||||
|
" for (i = 0; i < itersToDo; i++)\n"
|
||||||
|
" {\n";
|
||||||
|
|
||||||
|
os <<
|
||||||
|
" consec = 0;\n"
|
||||||
|
"\n"
|
||||||
|
" do\n"
|
||||||
|
" {\n";
|
||||||
|
if (ember.XaosPresent())
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" secondPoint.m_LastXfUsed = xformDistributions[xfsel[THREAD_ID_Y] + (" << CHOOSE_XFORM_GRAIN << " * (firstPoint.m_LastXfUsed + 1u))];\n\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" secondPoint.m_LastXfUsed = xformDistributions[xfsel[THREAD_ID_Y]];\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < ember.XformCount(); i++)
|
||||||
|
{
|
||||||
|
if (i == 0)
|
||||||
|
os <<
|
||||||
|
" if (secondPoint.m_LastXfUsed == " << i << ")\n";
|
||||||
|
else
|
||||||
|
os <<
|
||||||
|
" else if (secondPoint.m_LastXfUsed == " << i << ")\n";
|
||||||
|
|
||||||
|
os <<
|
||||||
|
" {\n" <<
|
||||||
|
" Xform" << i << "(&(ember->m_Xforms[" << i << "]), parVars, &firstPoint, &secondPoint, &mwc);\n" <<
|
||||||
|
" }\n";
|
||||||
|
}
|
||||||
|
os <<
|
||||||
|
"\n"
|
||||||
|
" ok = !BadVal(secondPoint.m_X) && !BadVal(secondPoint.m_Y);\n"
|
||||||
|
//" ok = !BadVal(secondPoint.m_X) && !BadVal(secondPoint.m_Y) && !BadVal(secondPoint.m_Z);\n"
|
||||||
|
"\n"
|
||||||
|
" if (!ok)\n"
|
||||||
|
" {\n"
|
||||||
|
" firstPoint.m_X = MwcNextNeg1Pos1(&mwc);\n"
|
||||||
|
" firstPoint.m_Y = MwcNextNeg1Pos1(&mwc);\n"
|
||||||
|
" firstPoint.m_Z = 0.0;\n"
|
||||||
|
" firstPoint.m_ColorX = secondPoint.m_ColorX;\n"
|
||||||
|
" consec++;\n"
|
||||||
|
//" badvals++;\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
" while (!ok && consec < 5);\n"
|
||||||
|
"\n"
|
||||||
|
" if (!ok)\n"
|
||||||
|
" {\n"
|
||||||
|
" secondPoint.m_X = MwcNextNeg1Pos1(&mwc);\n"
|
||||||
|
" secondPoint.m_Y = MwcNextNeg1Pos1(&mwc);\n"
|
||||||
|
" secondPoint.m_Z = 0.0;\n"
|
||||||
|
" }\n"
|
||||||
|
"\n"//Rotate points between threads. This is how randomization is achieved.
|
||||||
|
" uint swr = threadXY + ((i & 1u) * threadXDivRows);\n"
|
||||||
|
" uint sw = (swr * THREADS_PER_WARP + THREAD_ID_X) & threadsMinus1;\n"
|
||||||
|
"\n"
|
||||||
|
|
||||||
|
//Write to another thread's location.
|
||||||
|
" swap[sw] = secondPoint;\n"
|
||||||
|
"\n"
|
||||||
|
|
||||||
|
//Populate randomized xform index buffer with new random values.
|
||||||
|
" if (THREAD_ID_Y == 0 && THREAD_ID_X < NWARPS)\n"
|
||||||
|
" xfsel[THREAD_ID_X] = MwcNext(&mwc) % " << CHOOSE_XFORM_GRAIN << ";\n"
|
||||||
|
"\n"
|
||||||
|
" barrier(CLK_LOCAL_MEM_FENCE);\n"
|
||||||
|
"\n"
|
||||||
|
|
||||||
|
//Another thread will have written to this thread's location, so read the new value and use it for accumulation below.
|
||||||
|
" firstPoint = swap[threadIndex];\n"
|
||||||
|
"\n"
|
||||||
|
" if (fuse)\n"
|
||||||
|
" {\n"
|
||||||
|
" if (i >= fuseCount - 1)\n"
|
||||||
|
" {\n"
|
||||||
|
" i = 0;\n"
|
||||||
|
" fuse = false;\n"
|
||||||
|
" itersToDo = iterCount;\n"
|
||||||
|
" barrier(CLK_LOCAL_MEM_FENCE);\n"//Sort of seems necessary, sort of doesn't. Makes no speed difference.
|
||||||
|
" }\n"
|
||||||
|
"\n"
|
||||||
|
" continue;\n"
|
||||||
|
" }\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
if (ember.UseFinalXform())
|
||||||
|
{
|
||||||
|
//CPU takes an extra step here to preserve the opacity of the randomly selected xform, rather than the final xform's opacity.
|
||||||
|
//The same thing takes place here automatically because secondPoint.m_LastXfUsed is used below to retrieve the opacity when accumulating.
|
||||||
|
os <<
|
||||||
|
" if ((ember->m_Xforms[ember->m_FinalXformIndex].m_Opacity == 1) || (MwcNext01(&mwc) < ember->m_Xforms[ember->m_FinalXformIndex].m_Opacity))\n"
|
||||||
|
" {\n"
|
||||||
|
" Xform" << (ember.TotalXformCount() - 1) << "(&(ember->m_Xforms[ember->m_FinalXformIndex]), parVars, &secondPoint, &tempPoint, &mwc);\n"
|
||||||
|
" secondPoint = tempPoint;\n"
|
||||||
|
" }\n"
|
||||||
|
"\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
os << CreateProjectionString(ember);
|
||||||
|
|
||||||
|
if (doAccum)
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" p00 = secondPoint.m_X - ember->m_CenterX;\n"
|
||||||
|
" p01 = secondPoint.m_Y - ember->m_CenterY;\n"
|
||||||
|
" tempPoint.m_X = (p00 * ember->m_RotA) + (p01 * ember->m_RotB) + ember->m_CenterX;\n"
|
||||||
|
" tempPoint.m_Y = (p00 * ember->m_RotD) + (p01 * ember->m_RotE) + ember->m_CenterY;\n"
|
||||||
|
"\n"
|
||||||
|
//Add this point to the appropriate location in the histogram.
|
||||||
|
" if (CarToRasInBounds(carToRas, &tempPoint))\n"
|
||||||
|
" {\n"
|
||||||
|
" CarToRasConvertPointToSingle(carToRas, &tempPoint, &histIndex);\n"
|
||||||
|
"\n"
|
||||||
|
" if (histIndex < histSize)\n"//Provides an extra level of safety and makes no speed difference.
|
||||||
|
" {\n";
|
||||||
|
|
||||||
|
//Basic texture index interoplation does not produce identical results
|
||||||
|
//to the CPU. So the code here must explicitly do the same thing and not
|
||||||
|
//rely on the GPU texture coordinate lookup.
|
||||||
|
if (ember.m_PaletteMode == PALETTE_LINEAR)
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" real_t colorIndexFrac;\n"
|
||||||
|
" real_t colorIndex = secondPoint.m_ColorX * COLORMAP_LENGTH;\n"
|
||||||
|
" int intColorIndex = (int)colorIndex;\n"
|
||||||
|
" float4 palColor2;\n"
|
||||||
|
"\n"
|
||||||
|
" if (intColorIndex < 0)\n"
|
||||||
|
" {\n"
|
||||||
|
" intColorIndex = 0;\n"
|
||||||
|
" colorIndexFrac = 0;\n"
|
||||||
|
" }\n"
|
||||||
|
" else if (intColorIndex >= COLORMAP_LENGTH_MINUS_1)\n"
|
||||||
|
" {\n"
|
||||||
|
" intColorIndex = COLORMAP_LENGTH_MINUS_1 - 1;\n"
|
||||||
|
" colorIndexFrac = 1.0;\n"
|
||||||
|
" }\n"
|
||||||
|
" else\n"
|
||||||
|
" {\n"
|
||||||
|
" colorIndexFrac = colorIndex - (real_t)intColorIndex;\n"//Interpolate between intColorIndex and intColorIndex + 1.
|
||||||
|
" }\n"
|
||||||
|
"\n"
|
||||||
|
" iPaletteCoord.x = intColorIndex;\n"//Palette operations are strictly float because OpenCL does not support dp64 textures.
|
||||||
|
" palColor1 = read_imagef(palette, paletteSampler, iPaletteCoord);\n"
|
||||||
|
" iPaletteCoord.x += 1;\n"
|
||||||
|
" palColor2 = read_imagef(palette, paletteSampler, iPaletteCoord);\n"
|
||||||
|
" palColor1 = (palColor1 * (1.0f - (float)colorIndexFrac)) + (palColor2 * (float)colorIndexFrac);\n";//The 1.0f here *must* have the 'f' suffix at the end to compile.
|
||||||
|
}
|
||||||
|
else if (ember.m_PaletteMode == PALETTE_STEP)
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" iPaletteCoord.x = (int)(secondPoint.m_ColorX * COLORMAP_LENGTH);\n"
|
||||||
|
" palColor1 = read_imagef(palette, paletteSampler, iPaletteCoord);\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lockAccum)
|
||||||
|
{
|
||||||
|
if (typeid(T) == typeid(double))
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" AtomicAdd(&(histogram[histIndex].m_Reals[0]), (real_t)palColor1.x * ember->m_Xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n"//Always apply opacity, even though it's usually 1.
|
||||||
|
" AtomicAdd(&(histogram[histIndex].m_Reals[1]), (real_t)palColor1.y * ember->m_Xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n"
|
||||||
|
" AtomicAdd(&(histogram[histIndex].m_Reals[2]), (real_t)palColor1.z * ember->m_Xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n"
|
||||||
|
" AtomicAdd(&(histogram[histIndex].m_Reals[3]), (real_t)palColor1.w * ember->m_Xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" AtomicAdd(&(histogram[histIndex].m_Reals[0]), palColor1.x * ember->m_Xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n"//Always apply opacity, even though it's usually 1.
|
||||||
|
" AtomicAdd(&(histogram[histIndex].m_Reals[1]), palColor1.y * ember->m_Xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n"
|
||||||
|
" AtomicAdd(&(histogram[histIndex].m_Reals[2]), palColor1.z * ember->m_Xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n"
|
||||||
|
" AtomicAdd(&(histogram[histIndex].m_Reals[3]), palColor1.w * ember->m_Xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (typeid(T) == typeid(double))
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" real4 realColor;\n"
|
||||||
|
"\n"
|
||||||
|
" realColor.x = (real_t)palColor1.x;\n"
|
||||||
|
" realColor.y = (real_t)palColor1.y;\n"
|
||||||
|
" realColor.z = (real_t)palColor1.z;\n"
|
||||||
|
" realColor.w = (real_t)palColor1.w;\n"
|
||||||
|
" histogram[histIndex].m_Real4 += (realColor * ember->m_Xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" histogram[histIndex].m_Real4 += (palColor1 * ember->m_Xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
os <<
|
||||||
|
" }\n"//histIndex < histSize.
|
||||||
|
" }\n"//CarToRasInBounds.
|
||||||
|
"\n"
|
||||||
|
" barrier(CLK_GLOBAL_MEM_FENCE);\n";//Barrier every time, whether or not the point was in bounds, else artifacts will occur when doing strips.
|
||||||
|
}
|
||||||
|
|
||||||
|
os <<
|
||||||
|
" }\n"//Main for loop.
|
||||||
|
"\n"
|
||||||
|
//At this point, iterating for this round is done, so write the final points back out
|
||||||
|
//to the global points buffer to be used as inputs for the next round. This preserves point trajectory
|
||||||
|
//between kernel calls.
|
||||||
|
" points[pointsIndex] = firstPoint;\n"
|
||||||
|
" barrier(CLK_GLOBAL_MEM_FENCE);\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an OpenCL string of #defines and a corresponding host side vector for parametric variation values.
|
||||||
|
/// Parametric variations present a special problem in the iteration code.
|
||||||
|
/// The values can't be passed in with the array of other xform values because
|
||||||
|
/// the length of the parametric values is unknown.
|
||||||
|
/// This is solved by passing a separate buffer of values dedicated specifically
|
||||||
|
/// to parametric variations.
|
||||||
|
/// In OpenCL, a series of #define constants are declared which specify the indices in
|
||||||
|
/// the buffer where the various values are stored.
|
||||||
|
/// The possibility of a parametric variation type being present in multiple xforms is taken
|
||||||
|
/// into account by appending the xform index to the #define, thus making each unique.
|
||||||
|
/// The kernel creator then uses these to retrieve the values in the iteration code.
|
||||||
|
/// Example:
|
||||||
|
/// Xform1: Curl (curl_c1: 1.1, curl_c2: 2.2)
|
||||||
|
/// Xform2: Curl (curl_c1: 4.4, curl_c2: 5.5)
|
||||||
|
/// Xform3: Blob (blob_low: 1, blob_high: 2, blob_waves: 3)
|
||||||
|
///
|
||||||
|
/// Host vector to be passed as arg to the iter kernel call:
|
||||||
|
/// [1.1][2.2][4.4][5.5][1][2][3]
|
||||||
|
///
|
||||||
|
/// #defines in OpenCL to access the buffer:
|
||||||
|
///
|
||||||
|
/// #define CURL_C1_1 0
|
||||||
|
/// #define CURL_C2_1 1
|
||||||
|
/// #define CURL_C1_2 2
|
||||||
|
/// #define CURL_C2_2 3
|
||||||
|
/// #define BLOB_LOW_3 4
|
||||||
|
/// #define BLOB_HIGH_3 5
|
||||||
|
/// #define BLOB_WAVES_ 6
|
||||||
|
///
|
||||||
|
/// The variations the use these #defines by first looking up the index of the
|
||||||
|
/// xform they belong to in the parent ember and generating the OpenCL string based on that
|
||||||
|
/// in their overriden OpenCLString() functions.
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ember">The ember to create the values from</param>
|
||||||
|
/// <param name="params">The string,vector pair to store the values in</param>
|
||||||
|
/// <param name="doVals">True if the vector should be populated, else false. Default: true.</param>
|
||||||
|
/// <param name="doString">True if the string should be populated, else false. Default: true.</param>
|
||||||
|
template <typename T>
|
||||||
|
void IterOpenCLKernelCreator<T>::ParVarIndexDefines(Ember<T>& ember, pair<string, vector<T>>& params, bool doVals, bool doString)
|
||||||
|
{
|
||||||
|
unsigned int i, j, k, size = 0, xformCount = ember.TotalXformCount();
|
||||||
|
Xform<T>* xform;
|
||||||
|
ParametricVariation<T>* parVar;
|
||||||
|
ostringstream os;
|
||||||
|
|
||||||
|
if (doVals)
|
||||||
|
params.second.clear();
|
||||||
|
|
||||||
|
for (i = 0; i < xformCount; i++)
|
||||||
|
{
|
||||||
|
if (xform = ember.GetTotalXform(i))
|
||||||
|
{
|
||||||
|
unsigned int varCount = xform->TotalVariationCount();
|
||||||
|
|
||||||
|
for (j = 0; j < varCount; j++)
|
||||||
|
{
|
||||||
|
if (parVar = dynamic_cast<ParametricVariation<T>*>(xform->GetVariation(j)))
|
||||||
|
{
|
||||||
|
for (k = 0; k < parVar->ParamCount(); k++)
|
||||||
|
{
|
||||||
|
if (doString)
|
||||||
|
os << "#define " << ToUpper(parVar->Params()[k].Name()) << "_" << i << " " << size << endl;//Uniquely identify this param in this variation in this xform.
|
||||||
|
|
||||||
|
if (doVals)
|
||||||
|
params.second.push_back(parVar->Params()[k].ParamVal());
|
||||||
|
|
||||||
|
size++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (doString)
|
||||||
|
{
|
||||||
|
os << "\n";
|
||||||
|
params.first = os.str();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determine whether the two embers passed in differ enough
|
||||||
|
/// to require a rebuild of the iteration code.
|
||||||
|
/// A rebuild is required if they differ in the following ways:
|
||||||
|
/// Xform count
|
||||||
|
/// Final xform presence
|
||||||
|
/// Xaos presence
|
||||||
|
/// Palette accumulation mode
|
||||||
|
/// Xform post affine presence
|
||||||
|
/// Variation count
|
||||||
|
/// Variation type
|
||||||
|
/// Template argument expected to be float or double.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ember1">The first ember to compare</param>
|
||||||
|
/// <param name="ember2">The second ember to compare</param>
|
||||||
|
/// <returns>True if a rebuild is required, else false</returns>
|
||||||
|
template <typename T>
|
||||||
|
bool IterOpenCLKernelCreator<T>::IsBuildRequired(Ember<T>& ember1, Ember<T>& ember2)
|
||||||
|
{
|
||||||
|
unsigned int i, j, xformCount = ember1.TotalXformCount();
|
||||||
|
|
||||||
|
if (xformCount != ember2.TotalXformCount())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (ember1.UseFinalXform() != ember2.UseFinalXform())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (ember1.XaosPresent() != ember2.XaosPresent())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (ember1.m_PaletteMode != ember2.m_PaletteMode)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (ember1.ProjBits() != ember2.ProjBits())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
for (i = 0; i < xformCount; i++)
|
||||||
|
{
|
||||||
|
Xform<T>* xform1 = ember1.GetTotalXform(i);
|
||||||
|
Xform<T>* xform2 = ember2.GetTotalXform(i);
|
||||||
|
unsigned int varCount = xform1->TotalVariationCount();
|
||||||
|
|
||||||
|
if (xform1->HasPost() != xform2->HasPost())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (varCount != xform2->TotalVariationCount())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
for (j = 0; j < varCount; j++)
|
||||||
|
if (xform1->GetVariation(j)->VariationId() != xform2->GetVariation(j)->VariationId())
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create the zeroize kernel string.
|
||||||
|
/// OpenCL comes with no way to zeroize a buffer like memset()
|
||||||
|
/// would do on the CPU. So a special kernel must be ran to set a range
|
||||||
|
/// of memory addresses to zero.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The kernel string</returns>
|
||||||
|
template <typename T>
|
||||||
|
string IterOpenCLKernelCreator<T>::CreateZeroizeKernelString()
|
||||||
|
{
|
||||||
|
ostringstream os;
|
||||||
|
|
||||||
|
os <<
|
||||||
|
ConstantDefinesString(typeid(T) == typeid(double)) <<//Double precision doesn't matter here since it's not used.
|
||||||
|
"__kernel void " << m_ZeroizeEntryPoint << "(__global uchar* buffer, uint width, uint height)\n"
|
||||||
|
"{\n"
|
||||||
|
" if (GLOBAL_ID_X >= width || GLOBAL_ID_Y >= height)\n"
|
||||||
|
" return;\n"
|
||||||
|
"\n"
|
||||||
|
" buffer[(GLOBAL_ID_Y * width) + GLOBAL_ID_X] = 0;\n"//Can't use INDEX_IN_GRID_2D here because the grid might be larger than the buffer to make even dimensions.
|
||||||
|
" barrier(CLK_GLOBAL_MEM_FENCE);\n"//Just to be safe.
|
||||||
|
"}\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create the string for 3D projection based on the 3D values of the ember.
|
||||||
|
/// Projection is done on the second point.
|
||||||
|
/// If any of these fields toggle between 0 and nonzero between runs, a recompile is triggered.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ember">The ember to create the projection string for</param>
|
||||||
|
/// <returns>The kernel string</returns>
|
||||||
|
template <typename T>
|
||||||
|
string IterOpenCLKernelCreator<T>::CreateProjectionString(Ember<T>& ember)
|
||||||
|
{
|
||||||
|
unsigned int projBits = ember.ProjBits();
|
||||||
|
ostringstream os;
|
||||||
|
|
||||||
|
if (projBits)
|
||||||
|
{
|
||||||
|
if (projBits & PROJBITS_BLUR)
|
||||||
|
{
|
||||||
|
if (projBits & PROJBITS_YAW)
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" real_t dsin, dcos;\n"
|
||||||
|
" real_t t = MwcNext01(&mwc) * M_2PI;\n"
|
||||||
|
" real_t z = secondPoint.m_Z - ember->m_CamZPos;\n"
|
||||||
|
" real_t x = ember->m_C00 * secondPoint.m_X + ember->m_C10 * secondPoint.m_Y;\n"
|
||||||
|
" real_t y = ember->m_C01 * secondPoint.m_X + ember->m_C11 * secondPoint.m_Y + ember->m_C21 * z;\n"
|
||||||
|
"\n"
|
||||||
|
" z = ember->m_C02 * secondPoint.m_X + ember->m_C12 * secondPoint.m_Y + ember->m_C22 * z;\n"
|
||||||
|
"\n"
|
||||||
|
" real_t zr = 1 - ember->m_CamPerspective * z;\n"
|
||||||
|
" real_t dr = MwcNext01(&mwc) * ember->m_BlurCoef * z;\n"
|
||||||
|
"\n"
|
||||||
|
" dsin = sin(t);\n"
|
||||||
|
" dcos = cos(t);\n"
|
||||||
|
"\n"
|
||||||
|
" secondPoint.m_X = (x + dr * dcos) / zr;\n"
|
||||||
|
" secondPoint.m_Y = (y + dr * dsin) / zr;\n"
|
||||||
|
" secondPoint.m_Z -= ember->m_CamZPos;\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" real_t y, z, zr;\n"
|
||||||
|
" real_t dsin, dcos;\n"
|
||||||
|
" real_t t = MwcNext01(&mwc) * M_2PI;\n"
|
||||||
|
"\n"
|
||||||
|
" z = secondPoint.m_Z - ember->m_CamZPos;\n"
|
||||||
|
" y = ember->m_C11 * secondPoint.m_Y + ember->m_C21 * z;\n"
|
||||||
|
" z = ember->m_C12 * secondPoint.m_Y + ember->m_C22 * z;\n"
|
||||||
|
" zr = 1 - ember->m_CamPerspective * z;\n"
|
||||||
|
"\n"
|
||||||
|
" dsin = sin(t);\n"
|
||||||
|
" dcos = cos(t);\n"
|
||||||
|
"\n"
|
||||||
|
" real_t dr = MwcNext01(&mwc) * ember->m_BlurCoef * z;\n"
|
||||||
|
"\n"
|
||||||
|
" secondPoint.m_X = (secondPoint.m_X + dr * dcos) / zr;\n"
|
||||||
|
" secondPoint.m_Y = (y + dr * dsin) / zr;\n"
|
||||||
|
" secondPoint.m_Z -= ember->m_CamZPos;\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((projBits & PROJBITS_PITCH) || (projBits & PROJBITS_YAW))
|
||||||
|
{
|
||||||
|
if (projBits & PROJBITS_YAW)
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" real_t z = secondPoint.m_Z - ember->m_CamZPos;\n"
|
||||||
|
" real_t x = ember->m_C00 * secondPoint.m_X + ember->m_C10 * secondPoint.m_Y;\n"
|
||||||
|
" real_t y = ember->m_C01 * secondPoint.m_X + ember->m_C11 * secondPoint.m_Y + ember->m_C21 * z;\n"
|
||||||
|
" real_t zr = 1 - ember->m_CamPerspective * (ember->m_C02 * secondPoint.m_X + ember->m_C12 * secondPoint.m_Y + ember->m_C22 * z);\n"
|
||||||
|
"\n"
|
||||||
|
" secondPoint.m_X = x / zr;\n"
|
||||||
|
" secondPoint.m_Y = y / zr;\n"
|
||||||
|
" secondPoint.m_Z -= ember->m_CamZPos;\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" real_t z = secondPoint.m_Z - ember->m_CamZPos;\n"
|
||||||
|
" real_t y = ember->m_C11 * secondPoint.m_Y + ember->m_C21 * z;\n"
|
||||||
|
" real_t zr = 1 - ember->m_CamPerspective * (ember->m_C12 * secondPoint.m_Y + ember->m_C22 * z);\n"
|
||||||
|
"\n"
|
||||||
|
" secondPoint.m_X /= zr;\n"
|
||||||
|
" secondPoint.m_Y = y / zr;\n"
|
||||||
|
" secondPoint.m_Z -= ember->m_CamZPos;\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
" real_t zr = 1 - ember->m_CamPerspective * (secondPoint.m_Z - ember->m_CamZPos);\n"
|
||||||
|
"\n"
|
||||||
|
" secondPoint.m_X /= zr;\n"
|
||||||
|
" secondPoint.m_Y /= zr;\n"
|
||||||
|
" secondPoint.m_Z -= ember->m_CamZPos;\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
}
|
89
Source/EmberCL/IterOpenCLKernelCreator.h
Normal file
89
Source/EmberCL/IterOpenCLKernelCreator.h
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "EmberCLPch.h"
|
||||||
|
#include "EmberCLStructs.h"
|
||||||
|
#include "EmberCLFunctions.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// IterOpenCLKernelCreator class.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberCLns
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Class for creating the main iteration code in OpenCL.
|
||||||
|
/// It uses the Cuburn method of iterating where all conditionals
|
||||||
|
/// are stripped out and a specific kernel is compiled at run-time.
|
||||||
|
/// It uses a very sophisticated method for randomization that avoids
|
||||||
|
/// the problem of warp/wavefront divergence that would occur if every
|
||||||
|
/// thread selected a random xform to apply.
|
||||||
|
/// This only works with embers of type float, double is not supported.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBERCL_API IterOpenCLKernelCreator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
IterOpenCLKernelCreator();
|
||||||
|
IterOpenCLKernelCreator(bool nVidia);
|
||||||
|
string ZeroizeKernel();
|
||||||
|
string ZeroizeEntryPoint();
|
||||||
|
string IterEntryPoint();
|
||||||
|
string CreateIterKernelString(Ember<T>& ember, string& parVarDefines, bool lockAccum = false, bool doAccum = true);
|
||||||
|
static void ParVarIndexDefines(Ember<T>& ember, pair<string, vector<T>>& params, bool doVals = true, bool doString = true);
|
||||||
|
static bool IsBuildRequired(Ember<T>& ember1, Ember<T>& ember2);
|
||||||
|
|
||||||
|
private:
|
||||||
|
string CreateZeroizeKernelString();
|
||||||
|
string CreateProjectionString(Ember<T>& ember);
|
||||||
|
|
||||||
|
string m_IterEntryPoint;
|
||||||
|
string m_ZeroizeKernel;
|
||||||
|
string m_ZeroizeEntryPoint;
|
||||||
|
bool m_NVidia;
|
||||||
|
};
|
||||||
|
|
||||||
|
template EMBERCL_API class IterOpenCLKernelCreator<float>;
|
||||||
|
|
||||||
|
#ifdef DO_DOUBLE
|
||||||
|
template EMBERCL_API class IterOpenCLKernelCreator<double>;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
//template EMBERCL_API string IterOpenCLKernelCreator::CreateIterKernelString<float>(Ember<float>& ember, string& parVarDefines, bool lockAccum, bool doAccum);
|
||||||
|
//template EMBERCL_API string IterOpenCLKernelCreator::CreateIterKernelString<double>(Ember<double>& ember, string& parVarDefines, bool lockAccum, bool doAccum);
|
||||||
|
//
|
||||||
|
//template EMBERCL_API void IterOpenCLKernelCreator::ParVarIndexDefines<float>(Ember<float>& ember, pair<string, vector<float>>& params, bool doVals, bool doString);
|
||||||
|
//template EMBERCL_API void IterOpenCLKernelCreator::ParVarIndexDefines<double>(Ember<double>& ember, pair<string, vector<double>>& params, bool doVals, bool doString);
|
||||||
|
//
|
||||||
|
//template EMBERCL_API bool IterOpenCLKernelCreator::IsBuildRequired<float>(Ember<float>& ember1, Ember<float>& ember2);
|
||||||
|
//template EMBERCL_API bool IterOpenCLKernelCreator::IsBuildRequired<double>(Ember<double>& ember1, Ember<double>& ember2);
|
||||||
|
|
||||||
|
#ifdef OPEN_CL_TEST_AREA
|
||||||
|
typedef void (*KernelFuncPointer) (unsigned int gridWidth, unsigned int gridHeight, unsigned int blockWidth, unsigned int blockHeight,
|
||||||
|
unsigned int BLOCK_ID_X, unsigned int BLOCK_ID_Y, unsigned int THREAD_ID_X, unsigned int THREAD_ID_Y);
|
||||||
|
|
||||||
|
static void OpenCLSim(unsigned int gridWidth, unsigned int gridHeight, unsigned int blockWidth, unsigned int blockHeight, KernelFuncPointer func)
|
||||||
|
{
|
||||||
|
cout << "OpenCLSim(): " << endl;
|
||||||
|
cout << " Params: " << endl;
|
||||||
|
cout << " gridW: " << gridWidth << endl;
|
||||||
|
cout << " gridH: " << gridHeight << endl;
|
||||||
|
cout << " blockW: " << blockWidth << endl;
|
||||||
|
cout << " blockH: " << blockHeight << endl;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < gridHeight; i += blockHeight)
|
||||||
|
{
|
||||||
|
for (unsigned int j = 0; j < gridWidth; j += blockWidth)
|
||||||
|
{
|
||||||
|
for (unsigned int k = 0; k < blockHeight; k++)
|
||||||
|
{
|
||||||
|
for (unsigned int l = 0; l < blockWidth; l++)
|
||||||
|
{
|
||||||
|
func(gridWidth, gridHeight, blockWidth, blockHeight, j / blockWidth, i / blockHeight, l, k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
1366
Source/EmberCL/OpenCLWrapper.cpp
Normal file
1366
Source/EmberCL/OpenCLWrapper.cpp
Normal file
File diff suppressed because it is too large
Load Diff
219
Source/EmberCL/OpenCLWrapper.h
Normal file
219
Source/EmberCL/OpenCLWrapper.h
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "EmberCLPch.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// OpenCLWrapper, Spk, NamedBuffer, NamedImage2D, NamedImage2DGL classes.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberCLns
|
||||||
|
{
|
||||||
|
#if CL_VERSION_1_2
|
||||||
|
#define IMAGEGL2D cl::ImageGL
|
||||||
|
#else
|
||||||
|
#define IMAGEGL2D cl::Image2DGL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Class to contain all of the things needed to store an OpenCL program.
|
||||||
|
/// The name of it, the source, the compiled program object and the kernel.
|
||||||
|
/// </summary>
|
||||||
|
class EMBERCL_API Spk
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
string m_Name;
|
||||||
|
cl::Program::Sources m_Source;
|
||||||
|
cl::Program m_Program;
|
||||||
|
cl::Kernel m_Kernel;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Class to hold an OpenCL buffer with a name to identify it by.
|
||||||
|
/// </summary>
|
||||||
|
class EMBERCL_API NamedBuffer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NamedBuffer()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NamedBuffer(cl::Buffer& buff, string name)
|
||||||
|
{
|
||||||
|
m_Buffer = buff;
|
||||||
|
m_Name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
cl::Buffer m_Buffer;
|
||||||
|
string m_Name;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Class to hold a 2D image with a name to identify it by.
|
||||||
|
/// </summary>
|
||||||
|
class EMBERCL_API NamedImage2D
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NamedImage2D()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NamedImage2D(cl::Image2D& image, string name)
|
||||||
|
{
|
||||||
|
m_Image = image;
|
||||||
|
m_Name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
cl::Image2D m_Image;
|
||||||
|
string m_Name;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Class to hold a 2D image that is mapped to an OpenGL texture
|
||||||
|
/// and a name to identify it by.
|
||||||
|
/// </summary>
|
||||||
|
class EMBERCL_API NamedImage2DGL
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NamedImage2DGL()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NamedImage2DGL(IMAGEGL2D& image, string name)
|
||||||
|
{
|
||||||
|
m_Image = image;
|
||||||
|
m_Name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMAGEGL2D m_Image;
|
||||||
|
string m_Name;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Running kernels in OpenCL can require quite a bit of setup, tear down and
|
||||||
|
/// general housekeeping. This class helps shield the user from such hassles.
|
||||||
|
/// It's main utility is in holding collections of programs, buffers and images
|
||||||
|
/// all identified by names. That way, a user can access them as needed without
|
||||||
|
/// having to pollute their code.
|
||||||
|
/// In addition, writing to an existing object by name determines if the object
|
||||||
|
/// can be overwritten, or if it needs to be deleted and replaced by the new one.
|
||||||
|
/// This class derives from EmberReport, so the caller is able
|
||||||
|
/// to retrieve a text dump of error information if any errors occur.
|
||||||
|
/// </summary>
|
||||||
|
class EMBERCL_API OpenCLWrapper : public EmberReport
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
OpenCLWrapper();
|
||||||
|
bool CheckOpenCL();
|
||||||
|
bool Init(unsigned int platform, unsigned int device, bool shared = false);
|
||||||
|
|
||||||
|
//Programs.
|
||||||
|
bool AddProgram(std::string name, std::string& program, std::string& entryPoint, bool doublePrecision);
|
||||||
|
void ClearPrograms();
|
||||||
|
|
||||||
|
//Buffers.
|
||||||
|
bool AddBuffer(string name, size_t size, cl_mem_flags flags = CL_MEM_READ_WRITE);
|
||||||
|
bool AddAndWriteBuffer(string name, void* data, size_t size);
|
||||||
|
bool WriteBuffer(string name, void* data, size_t size);
|
||||||
|
bool WriteBuffer(unsigned int bufferIndex, void* data, size_t size);
|
||||||
|
bool ReadBuffer(string name, void* data, size_t size);
|
||||||
|
bool ReadBuffer(unsigned int bufferIndex, void* data, size_t size);
|
||||||
|
int FindBufferIndex(string name);
|
||||||
|
unsigned int GetBufferSize(string name);
|
||||||
|
unsigned int GetBufferSize(unsigned int bufferIndex);
|
||||||
|
void ClearBuffers();
|
||||||
|
|
||||||
|
//Images.
|
||||||
|
bool AddAndWriteImage(string name, cl_mem_flags flags, const cl::ImageFormat& format, ::size_t width, ::size_t height, ::size_t row_pitch, void* data = NULL, bool shared = false, GLuint texName = 0);
|
||||||
|
bool WriteImage2D(unsigned int index, bool shared, ::size_t width, ::size_t height, ::size_t row_pitch, void* data);
|
||||||
|
bool ReadImage(string name, ::size_t width, ::size_t height, ::size_t row_pitch, bool shared, void* data);
|
||||||
|
bool ReadImage(unsigned int imageIndex, ::size_t width, ::size_t height, ::size_t row_pitch, bool shared, void* data);
|
||||||
|
int FindImageIndex(string name, bool shared);
|
||||||
|
unsigned int GetImageSize(string name, bool shared);
|
||||||
|
unsigned int GetImageSize(unsigned int imageIndex, bool shared);
|
||||||
|
bool CompareImageParams(cl::Image& image, cl_mem_flags flags, const cl::ImageFormat& format, ::size_t width, ::size_t height, ::size_t row_pitch);
|
||||||
|
void ClearImages(bool shared);
|
||||||
|
bool CreateImage2D(cl::Image2D& image2D, cl_mem_flags flags, cl::ImageFormat format, ::size_t width, ::size_t height, ::size_t row_pitch = 0, void* data = NULL);
|
||||||
|
bool CreateImage2DGL(IMAGEGL2D& image2DGL, cl_mem_flags flags, GLenum target, GLint miplevel, GLuint texobj);
|
||||||
|
bool EnqueueAcquireGLObjects(string name);
|
||||||
|
bool EnqueueAcquireGLObjects(IMAGEGL2D& image);
|
||||||
|
bool EnqueueReleaseGLObjects(string name);
|
||||||
|
bool EnqueueReleaseGLObjects(IMAGEGL2D& image);
|
||||||
|
bool EnqueueAcquireGLObjects(const VECTOR_CLASS<cl::Memory>* memObjects = NULL);
|
||||||
|
bool EnqueueReleaseGLObjects(const VECTOR_CLASS<cl::Memory>* memObjects = NULL);
|
||||||
|
bool CreateSampler(cl::Sampler& sampler, cl_bool normalizedCoords, cl_addressing_mode addressingMode, cl_filter_mode filterMode);
|
||||||
|
|
||||||
|
//Arguments.
|
||||||
|
bool SetBufferArg(unsigned int kernelIndex, unsigned int argIndex, string name);
|
||||||
|
bool SetBufferArg(unsigned int kernelIndex, unsigned int argIndex, unsigned int bufferIndex);
|
||||||
|
bool SetImageArg(unsigned int kernelIndex, unsigned int argIndex, bool shared, string name);
|
||||||
|
bool SetImageArg(unsigned int kernelIndex, unsigned int argIndex, bool shared, unsigned int imageIndex);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set an argument in the specified kernel, at the specified argument index.
|
||||||
|
/// Must keep this here in the .h because it's templated.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="kernelIndex">Index of the kernel whose argument will be set</param>
|
||||||
|
/// <param name="argIndex">Index of the argument to set</param>
|
||||||
|
/// <param name="arg">The argument value to set</param>
|
||||||
|
/// <returns>True if success, else false</returns>
|
||||||
|
template <typename T>
|
||||||
|
bool SetArg(unsigned int kernelIndex, unsigned int argIndex, T arg)
|
||||||
|
{
|
||||||
|
if (m_Init && kernelIndex < m_Programs.size())
|
||||||
|
{
|
||||||
|
cl_int err = m_Programs[kernelIndex].m_Kernel.setArg(argIndex, arg);
|
||||||
|
|
||||||
|
return CheckCL(err, "cl::Kernel::setArg()");
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Kernels.
|
||||||
|
int FindKernelIndex(string name);
|
||||||
|
bool RunKernel(unsigned int kernelIndex, unsigned int totalGridWidth, unsigned int totalGridHeight, unsigned int totalGridDepth, unsigned int blockWidth, unsigned int blockHeight, unsigned int blockDepth);
|
||||||
|
|
||||||
|
//Info.
|
||||||
|
template<typename T>
|
||||||
|
T GetInfo(size_t platform, size_t device, cl_device_info name);
|
||||||
|
string PlatformName(size_t platform);
|
||||||
|
vector<string> PlatformNames();
|
||||||
|
string DeviceName(size_t platform, size_t device);
|
||||||
|
vector<string> DeviceNames(size_t platform);
|
||||||
|
string DeviceAndPlatformNames();
|
||||||
|
string DumpInfo();
|
||||||
|
|
||||||
|
//Accessors.
|
||||||
|
bool Ok();
|
||||||
|
bool Shared();
|
||||||
|
cl::Context Context();
|
||||||
|
unsigned int PlatformIndex();
|
||||||
|
unsigned int DeviceIndex();
|
||||||
|
unsigned int LocalMemSize();
|
||||||
|
|
||||||
|
static void MakeEvenGridDims(unsigned int blockW, unsigned int blockH, unsigned int& gridW, unsigned int& gridH);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool CreateContext(bool shared);
|
||||||
|
bool CreateSPK(std::string& name, std::string& program, std::string& entryPoint, Spk& spk, bool doublePrecision);
|
||||||
|
bool CheckCL(cl_int err, const char* name);
|
||||||
|
std::string ErrorToStringCL(cl_int err);
|
||||||
|
|
||||||
|
bool m_Init;
|
||||||
|
bool m_Shared;
|
||||||
|
unsigned int m_PlatformIndex;
|
||||||
|
unsigned int m_DeviceIndex;
|
||||||
|
unsigned int m_LocalMemSize;
|
||||||
|
cl::Platform m_Platform;
|
||||||
|
cl::Context m_Context;
|
||||||
|
cl::Device m_Device;
|
||||||
|
cl::CommandQueue m_Queue;
|
||||||
|
std::vector<cl::Platform> m_Platforms;
|
||||||
|
std::vector<std::vector<cl::Device>> m_Devices;
|
||||||
|
std::vector<cl::Device> m_DeviceVec;
|
||||||
|
std::vector<Spk> m_Programs;
|
||||||
|
std::vector<NamedBuffer> m_Buffers;
|
||||||
|
std::vector<NamedImage2D> m_Images;
|
||||||
|
std::vector<NamedImage2DGL> m_GLImages;
|
||||||
|
};
|
||||||
|
}
|
1340
Source/EmberCL/RendererCL.cpp
Normal file
1340
Source/EmberCL/RendererCL.cpp
Normal file
File diff suppressed because it is too large
Load Diff
156
Source/EmberCL/RendererCL.h
Normal file
156
Source/EmberCL/RendererCL.h
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "EmberCLPch.h"
|
||||||
|
#include "OpenCLWrapper.h"
|
||||||
|
#include "IterOpenCLKernelCreator.h"
|
||||||
|
#include "DEOpenCLKernelCreator.h"
|
||||||
|
#include "FinalAccumOpenCLKernelCreator.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// RendererCL class.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
namespace EmberCLns
|
||||||
|
{
|
||||||
|
class EMBERCL_API RendererCLBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual bool ReadFinal(unsigned char* pixels) { return false; }
|
||||||
|
virtual bool ClearFinal() { return false; }
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// RendererCL is a derivation of the basic CPU renderer which
|
||||||
|
/// overrides various functions to render on the GPU using OpenCL.
|
||||||
|
/// Since this class derives from EmberReport and also contains an
|
||||||
|
/// OpenCLWrapper member which also derives from EmberReport, the
|
||||||
|
/// reporting functions are overridden to aggregate the errors from
|
||||||
|
/// both sources.
|
||||||
|
/// It does not support different types for T and bucketT, so it only has one template argument
|
||||||
|
/// and uses both for the base.
|
||||||
|
/// </summary>
|
||||||
|
template <typename T>
|
||||||
|
class EMBERCL_API RendererCL : public RendererCLBase, public Renderer<T, T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RendererCL(unsigned int platform = 0, unsigned int device = 0, bool shared = false, GLuint outputTexID = 0);
|
||||||
|
~RendererCL();
|
||||||
|
|
||||||
|
//Ordinary member functions for OpenCL specific tasks.
|
||||||
|
bool Init(unsigned int platform, unsigned int device, bool shared, GLuint outputTexID);
|
||||||
|
inline unsigned int IterBlocksWide();
|
||||||
|
inline unsigned int IterBlocksHigh();
|
||||||
|
inline unsigned int IterBlockWidth();
|
||||||
|
inline unsigned int IterBlockHeight();
|
||||||
|
inline unsigned int IterGridWidth();
|
||||||
|
inline unsigned int IterGridHeight();
|
||||||
|
inline unsigned int TotalIterKernelCount();
|
||||||
|
unsigned int PlatformIndex();
|
||||||
|
unsigned int DeviceIndex();
|
||||||
|
bool ReadHist();
|
||||||
|
bool ReadAccum();
|
||||||
|
bool ReadPoints(vector<PointCL<T>>& vec);
|
||||||
|
virtual bool ReadFinal(unsigned char* pixels);
|
||||||
|
virtual bool ClearFinal();
|
||||||
|
bool ClearHist();
|
||||||
|
bool ClearAccum();
|
||||||
|
bool WritePoints(vector<PointCL<T>>& vec);
|
||||||
|
string IterKernel();
|
||||||
|
|
||||||
|
//Public virtual functions overriden from Renderer.
|
||||||
|
virtual unsigned __int64 MemoryAvailable();
|
||||||
|
virtual bool Ok() const;
|
||||||
|
virtual void NumChannels(unsigned int numChannels);
|
||||||
|
virtual void DumpErrorReport();
|
||||||
|
virtual void ClearErrorReport();
|
||||||
|
virtual unsigned int SubBatchSize() const;
|
||||||
|
virtual unsigned int ThreadCount() const;
|
||||||
|
virtual void ThreadCount(unsigned int threads, const char* seedString = NULL);
|
||||||
|
virtual bool CreateDEFilter(bool& newAlloc);
|
||||||
|
virtual bool CreateSpatialFilter(bool& newAlloc);
|
||||||
|
virtual eRendererType RendererType() const;
|
||||||
|
virtual string ErrorReportString();
|
||||||
|
virtual vector<string> ErrorReport();
|
||||||
|
|
||||||
|
#ifndef TEST_CL
|
||||||
|
protected:
|
||||||
|
#endif
|
||||||
|
//Protected virtual functions overriden from Renderer.
|
||||||
|
virtual void MakeDmap(T colorScalar);
|
||||||
|
virtual bool Alloc();
|
||||||
|
virtual bool ResetBuckets(bool resetHist = true, bool resetAccum = true);
|
||||||
|
virtual eRenderStatus LogScaleDensityFilter();
|
||||||
|
virtual eRenderStatus GaussianDensityFilter();
|
||||||
|
virtual eRenderStatus AccumulatorToFinalImage(unsigned char* pixels, size_t finalOffset);
|
||||||
|
virtual EmberStats Iterate(unsigned __int64 iterCount, unsigned int pass, unsigned int temporalSample);
|
||||||
|
|
||||||
|
private:
|
||||||
|
//Private functions for making and running OpenCL programs.
|
||||||
|
bool BuildIterProgramForEmber(bool doAccum = true);
|
||||||
|
bool RunIter(unsigned __int64 iterCount, unsigned int pass, unsigned int temporalSample, unsigned __int64& itersRan);
|
||||||
|
eRenderStatus RunLogScaleFilter();
|
||||||
|
eRenderStatus RunDensityFilter();
|
||||||
|
eRenderStatus RunFinalAccum();
|
||||||
|
bool ClearBuffer(string bufferName, unsigned int width, unsigned int height, unsigned int elementSize);
|
||||||
|
bool RunDensityFilterPrivate(unsigned int kernelIndex, unsigned int gridW, unsigned int gridH, unsigned int blockW, unsigned int blockH, unsigned int chunkSizeW, unsigned int chunkSizeH, unsigned int rowParity, unsigned int colParity);
|
||||||
|
int MakeAndGetDensityFilterProgram(unsigned int ss, unsigned int filterWidth);
|
||||||
|
int MakeAndGetFinalAccumProgram(T& alphaBase, T& alphaScale);
|
||||||
|
int MakeAndGetGammaCorrectionProgram();
|
||||||
|
|
||||||
|
//Private functions passing data to OpenCL programs.
|
||||||
|
DensityFilterCL<T> ConvertDensityFilter();
|
||||||
|
SpatialFilterCL<T> ConvertSpatialFilter();
|
||||||
|
EmberCL<T> ConvertEmber(Ember<T>& ember);
|
||||||
|
static CarToRasCL<T> ConvertCarToRas(const CarToRas<T>& carToRas);
|
||||||
|
|
||||||
|
bool m_Init;
|
||||||
|
bool m_NVidia;
|
||||||
|
bool m_DoublePrecision;
|
||||||
|
unsigned int m_IterBlocksWide, m_IterBlockWidth;
|
||||||
|
unsigned int m_IterBlocksHigh, m_IterBlockHeight;
|
||||||
|
unsigned int m_MaxDEBlockSizeW;
|
||||||
|
unsigned int m_MaxDEBlockSizeH;
|
||||||
|
unsigned int m_WarpSize;
|
||||||
|
unsigned int m_Calls;
|
||||||
|
|
||||||
|
string m_EmberBufferName;
|
||||||
|
string m_ParVarsBufferName;
|
||||||
|
string m_DistBufferName;
|
||||||
|
string m_CarToRasBufferName;
|
||||||
|
string m_DEFilterParamsBufferName;
|
||||||
|
string m_SpatialFilterParamsBufferName;
|
||||||
|
string m_DECoefsBufferName;
|
||||||
|
string m_DEWidthsBufferName;
|
||||||
|
string m_DECoefIndicesBufferName;
|
||||||
|
string m_SpatialFilterCoefsBufferName;
|
||||||
|
string m_HistBufferName;
|
||||||
|
string m_AccumBufferName;
|
||||||
|
string m_FinalImageName;
|
||||||
|
string m_PointsBufferName;
|
||||||
|
|
||||||
|
string m_IterKernel;
|
||||||
|
|
||||||
|
OpenCLWrapper m_Wrapper;
|
||||||
|
cl::ImageFormat m_PaletteFormat;
|
||||||
|
cl::ImageFormat m_FinalFormat;
|
||||||
|
cl::Image2D m_Palette;
|
||||||
|
IMAGEGL2D m_AccumImage;
|
||||||
|
GLuint m_OutputTexID;
|
||||||
|
EmberCL<T> m_EmberCL;
|
||||||
|
Palette<float> m_Dmap;//Used instead of the base class' m_Dmap because OpenCL only supports float textures.
|
||||||
|
CarToRasCL<T> m_CarToRasCL;
|
||||||
|
DensityFilterCL<T> m_DensityFilterCL;
|
||||||
|
SpatialFilterCL<T> m_SpatialFilterCL;
|
||||||
|
IterOpenCLKernelCreator<T> m_IterOpenCLKernelCreator;
|
||||||
|
DEOpenCLKernelCreator<T> m_DEOpenCLKernelCreator;
|
||||||
|
FinalAccumOpenCLKernelCreator<T> m_FinalAccumOpenCLKernelCreator;
|
||||||
|
pair<string, vector<T>> m_Params;
|
||||||
|
Ember<T> m_LastBuiltEmber;
|
||||||
|
};
|
||||||
|
|
||||||
|
template EMBERCL_API class RendererCL<float>;
|
||||||
|
|
||||||
|
#ifdef DO_DOUBLE
|
||||||
|
template EMBERCL_API class RendererCL<double>;
|
||||||
|
#endif
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user