--User changes

-Add new palettes from user Rubydeva.

--Bug fixes
 -Avoid an occasional divide by zero in the OpenCL renderer when using the interactive editor.

--Code changes
 -Use exact comparisons in IsID() and IsZero() in Affine2D.
 -When testing for bad point values while iterating, only test for NaN now.
 -For rendering with OpenCL on the command line and in the final render dialog, use an optimized kernel that does a direct assignment for any affines which are ID.
This commit is contained in:
Person 2018-09-21 22:42:18 -07:00
parent 6f11f7df92
commit 55a2c393cf
21 changed files with 75557 additions and 48 deletions

View File

@ -239,6 +239,26 @@
<File Id="tatasz_pack_03.gradient" Source="$(var.SolutionDir)..\..\..\Data\tatasz_pack_03.gradient" KeyPath="yes" Checksum="yes" ReadOnly="yes"/> <File Id="tatasz_pack_03.gradient" Source="$(var.SolutionDir)..\..\..\Data\tatasz_pack_03.gradient" KeyPath="yes" Checksum="yes" ReadOnly="yes"/>
</Component> </Component>
<Component Id="Quartz_Varieties.ugr" Guid="b319cfb3-9037-490f-a7bc-608c4fc51361">
<File Id="Quartz_Varieties.ugr" Source="$(var.SolutionDir)..\..\..\Data\Quartz_Varieties.ugr" KeyPath="yes" Checksum="yes" ReadOnly="yes"/>
</Component>
<Component Id="Amphibole_Supergroup.ugr" Guid="17f19f07-bf1a-441f-8547-cf76ac5d146d">
<File Id="Amphibole_Supergroup.ugr" Source="$(var.SolutionDir)..\..\..\Data\Amphibole_Supergroup.ugr" KeyPath="yes" Checksum="yes" ReadOnly="yes"/>
</Component>
<Component Id="Apatite_Supergroup.ugr" Guid="98355dc3-d06c-4182-8948-0ff17557b041">
<File Id="Apatite_Supergroup.ugr" Source="$(var.SolutionDir)..\..\..\Data\Apatite_Supergroup.ugr" KeyPath="yes" Checksum="yes" ReadOnly="yes"/>
</Component>
<Component Id="Feldspar_Group.ugr" Guid="5bb329fe-c8ea-475e-988b-2108f64b2228">
<File Id="Feldspar_Group.ugr" Source="$(var.SolutionDir)..\..\..\Data\Feldspar_Group.ugr" KeyPath="yes" Checksum="yes" ReadOnly="yes"/>
</Component>
<Component Id="Mica_Group.ugr" Guid="d907fead-c39a-4a97-9574-ed886d43c6ca">
<File Id="Mica_Group.ugr" Source="$(var.SolutionDir)..\..\..\Data\Mica_Group.ugr" KeyPath="yes" Checksum="yes" ReadOnly="yes"/>
</Component>
<Component Id="dark_windows.qss" Guid="c120ace3-5fab-416f-b7f1-a8d9e3e0f061"> <Component Id="dark_windows.qss" Guid="c120ace3-5fab-416f-b7f1-a8d9e3e0f061">
<File Id="dark_windows.qss" Source="$(var.SolutionDir)..\..\..\Data\dark_windows.qss" KeyPath="yes" Checksum="yes" ReadOnly="yes"/> <File Id="dark_windows.qss" Source="$(var.SolutionDir)..\..\..\Data\dark_windows.qss" KeyPath="yes" Checksum="yes" ReadOnly="yes"/>
</Component> </Component>

View File

@ -67,7 +67,12 @@ $$ASSETS_DIR/tatasz_pack_01.gradient \
$$ASSETS_DIR/tatasz_pack_02_colder.gradient \ $$ASSETS_DIR/tatasz_pack_02_colder.gradient \
$$ASSETS_DIR/tatasz_pack_02_dark.gradient \ $$ASSETS_DIR/tatasz_pack_02_dark.gradient \
$$ASSETS_DIR/tatasz_pack_02_warmer.gradient \ $$ASSETS_DIR/tatasz_pack_02_warmer.gradient \
$$ASSETS_DIR/tatasz_pack_03.gradient $$ASSETS_DIR/tatasz_pack_03.gradient \
$$ASSETS_DIR/Amphibole_Supergroup.ugr \
$$ASSETS_DIR/Apatite_Supergroup.ugr \
$$ASSETS_DIR/Feldspar_Group.ugr \
$$ASSETS_DIR/Mica_Group.ugr \
$$ASSETS_DIR/Quartz_Varieties.ugr
#message(PALETTE INSTALL SOURCE: $$palettes.files) #message(PALETTE INSTALL SOURCE: $$palettes.files)
INSTALLS += palettes INSTALLS += palettes

21484
Data/Amphibole_Supergroup.ugr Normal file

File diff suppressed because it is too large Load Diff

15196
Data/Apatite_Supergroup.ugr Normal file

File diff suppressed because it is too large Load Diff

7336
Data/Feldspar_Group.ugr Normal file

File diff suppressed because it is too large Load Diff

13100
Data/Mica_Group.ugr Normal file

File diff suppressed because it is too large Load Diff

18340
Data/Quartz_Varieties.ugr Normal file

File diff suppressed because it is too large Load Diff

View File

@ -150,12 +150,12 @@ void Affine2D<T>::MakeID()
template <typename T> template <typename T>
bool Affine2D<T>::IsID() const bool Affine2D<T>::IsID() const
{ {
return (IsClose<T>(A(), 1)) && return (A() == 1) &&
(IsClose<T>(B(), 0)) && (B() == 0) &&
(IsClose<T>(C(), 0)) && (C() == 0) &&
(IsClose<T>(D(), 0)) && (D() == 0) &&
(IsClose<T>(E(), 1)) && (E() == 1) &&
(IsClose<T>(F(), 0)); (F() == 0);
} }
/// <summary> /// <summary>
@ -165,12 +165,12 @@ bool Affine2D<T>::IsID() const
template <typename T> template <typename T>
bool Affine2D<T>::IsZero() const bool Affine2D<T>::IsZero() const
{ {
return (IsClose<T>(A(), 0)) && return (A() == 0) &&
(IsClose<T>(B(), 0)) && (B() == 0) &&
(IsClose<T>(C(), 0)) && (C() == 0) &&
(IsClose<T>(D(), 0)) && (D() == 0) &&
(IsClose<T>(E(), 0)) && (E() == 0) &&
(IsClose<T>(F(), 0)); (F() == 0);
} }
/// <summary> /// <summary>

View File

@ -60,7 +60,7 @@ namespace EmberNs
#define XC(c) (reinterpret_cast<const xmlChar*>(c)) #define XC(c) (reinterpret_cast<const xmlChar*>(c))
#define CX(c) (reinterpret_cast<char*>(c)) #define CX(c) (reinterpret_cast<char*>(c))
#define CCX(c) (reinterpret_cast<const char*>(c)) #define CCX(c) (reinterpret_cast<const char*>(c))
#define BadVal(x) (((x) != (x)) || ((x) > 1e20) || ((x) < -1e20)) #define BadVal(x) (std::isnan(x))
#define Vlen(x) (sizeof(x) / sizeof(*x)) #define Vlen(x) (sizeof(x) / sizeof(*x))
#define SQR(x) ((x) * (x)) #define SQR(x) ((x) * (x))
#define CUBE(x) ((x) * (x) * (x)) #define CUBE(x) ((x) * (x) * (x))

View File

@ -61,6 +61,10 @@ bool EmberAnimate(int argc, _TCHAR* argv[], EmberOptions& opt)
return false; return false;
} }
for (auto& renderer : renderers)
if (auto rendererCL = dynamic_cast<RendererCLBase*>(renderer.get()))
rendererCL->OptAffine(true);//Optimize empty affines for final renderers, this is normally false for the interactive renderer.
if (opt.DoProgress()) if (opt.DoProgress())
renderers[0]->Callback(progress.get()); renderers[0]->Callback(progress.get());

View File

@ -73,7 +73,7 @@ static string ConstantDefinesString(bool doublePrecision)
"#define COLORMAP_LENGTH 256u\n" "#define COLORMAP_LENGTH 256u\n"
"#define COLORMAP_LENGTH_MINUS_1 255\n" "#define COLORMAP_LENGTH_MINUS_1 255\n"
"#define DE_THRESH 100u\n" "#define DE_THRESH 100u\n"
"#define BadVal(x) (((x) != (x)) || ((x) > 1e20) || ((x) < -1e20))\n" "#define BadVal(x) (isnan(x))\n"
"#define SQR(x) ((x) * (x))\n" "#define SQR(x) ((x) * (x))\n"
"#define CUBE(x) ((x) * (x) * (x))\n" "#define CUBE(x) ((x) * (x) * (x))\n"
"#define MPI ((real_t)M_PI)\n" "#define MPI ((real_t)M_PI)\n"

View File

@ -32,10 +32,12 @@ template <typename T> const string& IterOpenCLKernelCreator<T>::IterEntryPoint()
/// </summary> /// </summary>
/// <param name="ember">The ember to create the kernel string for</param> /// <param name="ember">The ember to create the kernel string for</param>
/// <param name="params">The parametric variation #define string</param> /// <param name="params">The parametric variation #define string</param>
/// <param name="optAffine">True to optimize with a simple assignment when the pre affine transform is empty, else false. True is better for final renders, false for interactive to reduce repeated compilations.</param>
/// <param name="lockAccum">Whether to lock when accumulating to the histogram. This is only for debugging. Default: false.</param>
/// <param name="doAccum">Debugging parameter to include or omit accumulating to the histogram. Default: true.</param> /// <param name="doAccum">Debugging parameter to include or omit accumulating to the histogram. Default: true.</param>
/// <returns>The kernel string</returns> /// <returns>The kernel string</returns>
template <typename T> template <typename T>
string IterOpenCLKernelCreator<T>::CreateIterKernelString(const Ember<T>& ember, const string& parVarDefines, const string& globalSharedDefines, bool lockAccum, bool doAccum) string IterOpenCLKernelCreator<T>::CreateIterKernelString(const Ember<T>& ember, const string& parVarDefines, const string& globalSharedDefines, bool optAffine, bool lockAccum, bool doAccum)
{ {
bool doublePrecision = typeid(T) == typeid(double); bool doublePrecision = typeid(T) == typeid(double);
size_t i = 0, v, varIndex, varCount; size_t i = 0, v, varIndex, varCount;
@ -102,18 +104,19 @@ string IterOpenCLKernelCreator<T>::CreateIterKernelString(const Ember<T>& ember,
} }
else else
{ {
/* if (xform->m_Affine.IsID()) if (optAffine && xform->m_Affine.IsID())
{ {
xformFuncs << xformFuncs <<
" transX = inPoint->m_X;\n" << " transX = inPoint->m_X;\n" <<
" transY = inPoint->m_Y;\n"; " transY = inPoint->m_Y;\n";
} }
else*/ else
{ {
xformFuncs << xformFuncs <<
" transX = fma(xform->m_A, inPoint->m_X, fma(xform->m_B, inPoint->m_Y, xform->m_C));\n" << " transX = fma(xform->m_A, inPoint->m_X, fma(xform->m_B, inPoint->m_Y, xform->m_C));\n" <<
" transY = fma(xform->m_D, inPoint->m_X, fma(xform->m_E, inPoint->m_Y, xform->m_F));\n"; " transY = fma(xform->m_D, inPoint->m_X, fma(xform->m_E, inPoint->m_Y, xform->m_F));\n";
} }
xformFuncs << xformFuncs <<
" transZ = inPoint->m_Z;\n"; " transZ = inPoint->m_Z;\n";
varCount = xform->PreVariationCount(); varCount = xform->PreVariationCount();
@ -375,7 +378,7 @@ string IterOpenCLKernelCreator<T>::CreateIterKernelString(const Ember<T>& ember,
os << os <<
"\n" "\n"
" ok = !BadVal(secondPoint.m_X) && !BadVal(secondPoint.m_Y);\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" //" ok = !BadVal(secondPoint.m_X) && !BadVal(secondPoint.m_Y) && !isnan(secondPoint.m_Z);\n"
"\n" "\n"
" if (!ok)\n" " if (!ok)\n"
" {\n" " {\n"
@ -803,9 +806,10 @@ string IterOpenCLKernelCreator<T>::VariationStateInitString(const Ember<T>& embe
/// </summary> /// </summary>
/// <param name="ember1">The first ember to compare</param> /// <param name="ember1">The first ember to compare</param>
/// <param name="ember2">The second ember to compare</param> /// <param name="ember2">The second ember to compare</param>
/// <param name="optAffine">True to optimize with a simple assignment when the pre affine transform is empty, else false. True is better for final renders, false for interactive to reduce repeated compilations.</param>
/// <returns>True if a rebuild is required, else false</returns> /// <returns>True if a rebuild is required, else false</returns>
template <typename T> template <typename T>
bool IterOpenCLKernelCreator<T>::IsBuildRequired(const Ember<T>& ember1, const Ember<T>& ember2) bool IterOpenCLKernelCreator<T>::IsBuildRequired(const Ember<T>& ember1, const Ember<T>& ember2, bool optAffine)
{ {
size_t i, j, xformCount = ember1.TotalXformCount(); size_t i, j, xformCount = ember1.TotalXformCount();
@ -830,8 +834,8 @@ bool IterOpenCLKernelCreator<T>::IsBuildRequired(const Ember<T>& ember1, const E
auto xform2 = ember2.GetTotalXform(i); auto xform2 = ember2.GetTotalXform(i);
auto varCount = xform1->TotalVariationCount(); auto varCount = xform1->TotalVariationCount();
//if (xform1->m_Affine.IsID() != xform2->m_Affine.IsID()) if (optAffine && (xform1->m_Affine.IsID() != xform2->m_Affine.IsID()))
// return true; return true;
if (xform1->HasPost() != xform2->HasPost()) if (xform1->HasPost() != xform2->HasPost())
return true; return true;

View File

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

View File

@ -798,7 +798,7 @@ EmberStats RendererCL<T, bucketT>::Iterate(size_t iterCount, size_t temporalSamp
ConvertCarToRas(CoordMap()); ConvertCarToRas(CoordMap());
//Rebuilding is expensive, so only do it if it's required. //Rebuilding is expensive, so only do it if it's required.
if (IterOpenCLKernelCreator<T>::IsBuildRequired(m_Ember, m_LastBuiltEmber)) if (IterOpenCLKernelCreator<T>::IsBuildRequired(m_Ember, m_LastBuiltEmber, m_OptAffine))
b = BuildIterProgramForEmber(true); b = BuildIterProgramForEmber(true);
if (b) if (b)
@ -905,7 +905,7 @@ bool RendererCL<T, bucketT>::BuildIterProgramForEmber(bool doAccum)
if (b) if (b)
{ {
m_CompileBegun(); m_CompileBegun();
m_IterKernel = m_IterOpenCLKernelCreator.CreateIterKernelString(m_Ember, m_Params.first, m_GlobalShared.first, m_LockAccum, doAccum); m_IterKernel = m_IterOpenCLKernelCreator.CreateIterKernelString(m_Ember, m_Params.first, m_GlobalShared.first, m_OptAffine, m_LockAccum, doAccum);
//cout << "Building: " << "\n" << iterProgram << "\n"; //cout << "Building: " << "\n" << iterProgram << "\n";
vector<std::thread> threads; vector<std::thread> threads;
std::function<void(RendererClDevice*)> func = [&](RendererClDevice * dev) std::function<void(RendererClDevice*)> func = [&](RendererClDevice * dev)
@ -962,6 +962,9 @@ template <typename T, typename bucketT>
bool RendererCL<T, bucketT>::RunIter(size_t iterCount, size_t temporalSample, size_t& itersRan) bool RendererCL<T, bucketT>::RunIter(size_t iterCount, size_t temporalSample, size_t& itersRan)
{ {
//Timing t;//, t2(4); //Timing t;//, t2(4);
if (iterCount == 0)//In rare cases this can happen in the interactive renderer, so just assume it's finished iterating to avoid dividing by zero below.
return true;
bool success = !m_Devices.empty(); bool success = !m_Devices.empty();
uint histSuperSize = uint(SuperSize()); uint histSuperSize = uint(SuperSize());
size_t launches = size_t(ceil(double(iterCount) / IterCountPerGrid())); size_t launches = size_t(ceil(double(iterCount) / IterCountPerGrid()));

View File

@ -22,7 +22,13 @@ public:
virtual bool ReadFinal(v4F* pixels) { return false; } virtual bool ReadFinal(v4F* pixels) { return false; }
virtual bool ClearFinal() { return false; } virtual bool ClearFinal() { return false; }
virtual bool AnyNvidia() const { return false; } virtual bool AnyNvidia() const { return false; }
bool OptAffine() const { return m_OptAffine; }
void OptAffine(bool optAffine) { m_OptAffine = optAffine; }
std::function<void(void)> m_CompileBegun; std::function<void(void)> m_CompileBegun;
protected:
bool m_OptAffine = false;
}; };
/// <summary> /// <summary>

View File

@ -61,6 +61,9 @@ bool EmberRender(int argc, _TCHAR* argv[], EmberOptions& opt)
if (opt.EmberCL() && renderer->RendererType() != eRendererType::OPENCL_RENDERER)//OpenCL init failed, so fall back to CPU. if (opt.EmberCL() && renderer->RendererType() != eRendererType::OPENCL_RENDERER)//OpenCL init failed, so fall back to CPU.
opt.EmberCL(false); opt.EmberCL(false);
if (auto rendererCL = dynamic_cast<RendererCLBase*>(renderer.get()))
rendererCL->OptAffine(true);//Optimize empty affines for final renderers, this is normally false for the interactive renderer.
if (!InitPaletteList<float>(fullpath, opt.PalettePath()))//For any modern flames, the palette isn't used. This is for legacy purposes and should be removed. if (!InitPaletteList<float>(fullpath, opt.PalettePath()))//For any modern flames, the palette isn't used. This is for legacy purposes and should be removed.
return false; return false;

View File

@ -2316,9 +2316,9 @@ int _tmain(int argc, _TCHAR* argv[])
//t.Tic(); //t.Tic();
//TestCpuGpuResults<float>(); //TestCpuGpuResults<float>();
//t.Toc("TestCpuGpuResults<float>()"); //t.Toc("TestCpuGpuResults<float>()");
t.Tic(); //t.Tic();
b = TestAllVarsCLBuild<float>(0, 0, true); //b = TestAllVarsCLBuild<float>(0, 0, true);
t.Toc("TestAllVarsCLBuild<float>()"); //t.Toc("TestAllVarsCLBuild<float>()");
if (b) if (b)
{ {
@ -2336,10 +2336,9 @@ int _tmain(int argc, _TCHAR* argv[])
//t.Toc("TestCpuGpuResults<double>()"); //t.Toc("TestCpuGpuResults<double>()");
if (b) if (b)
{ {
t.Tic(); //t.Tic();
b = TestAllVarsCLBuild<double>(0, 0, true); //b = TestAllVarsCLBuild<double>(0, 0, true);
t.Toc("TestAllVarsCLBuild<double>()"); //t.Toc("TestAllVarsCLBuild<double>()");
if (b) if (b)
{ {
#ifdef DO_NVIDIA #ifdef DO_NVIDIA

View File

@ -6,7 +6,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>596</width> <width>692</width>
<height>729</height> <height>729</height>
</rect> </rect>
</property> </property>
@ -39,7 +39,7 @@
<rect> <rect>
<x>6</x> <x>6</x>
<y>5</y> <y>5</y>
<width>583</width> <width>681</width>
<height>221</height> <height>221</height>
</rect> </rect>
</property> </property>
@ -87,7 +87,7 @@
<rect> <rect>
<x>10</x> <x>10</x>
<y>190</y> <y>190</y>
<width>586</width> <width>671</width>
<height>501</height> <height>501</height>
</rect> </rect>
</property> </property>
@ -120,7 +120,7 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://www.qt.io/developers/&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Qt&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Digia Plc (GPL v3, LGPL v2)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://g-truc.net&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;glm&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Christophe Riccio (MIT License)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://threadingbuildingblocks.org&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Threading Building Blocks&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Intel Corporation (GPLv2)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://libjpeg.sourceforge.net&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;libjpeg&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Independent JPEG Group (Free Software License)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://libpng.org&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;libpng&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Glenn Randers-Pehrson et al (Libpng License)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://xmlsoft.org&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;libxml2&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Daniel Veillard (MIT License)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://zlib.net&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;zlib&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Jean-loup Gailly, Mark Adler (Zlib License)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://burtleburtle.net/bob/cplus/isaac.hpp&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;QTIsaac&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Robert J. Jenkins, Quinn Tyler Jackson (Public Domain)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://cas.ee.ic.ac.uk/people/dt10/research/rngs-gpu-mwc64x.html&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;MWC64X Random Number Generator&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: David Thomas (Public Domain)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;https://github.com/brofield/simpleopt&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;SimpleOpt&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Brodie Thiesfield (MIT License)&lt;/span&gt;&lt;/p&gt; &lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://www.qt.io/developers/&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Qt&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Digia Plc (GPL v3, LGPL v2)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://g-truc.net&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;glm&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Christophe Riccio (MIT License)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://threadingbuildingblocks.org&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Threading Building Blocks&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Intel Corporation (GPLv2)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://libjpeg.sourceforge.net&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;libjpeg&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Independent JPEG Group (Free Software License)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://libpng.org&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;libpng&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Glenn Randers-Pehrson et al (Libpng License)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://xmlsoft.org&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;libxml2&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Daniel Veillard (MIT License)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://zlib.net&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;zlib&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Jean-loup Gailly, Mark Adler (Zlib License)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://burtleburtle.net/bob/cplus/isaac.hpp&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;QTIsaac&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Robert J. Jenkins, Quinn Tyler Jackson (Public Domain)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://cas.ee.ic.ac.uk/people/dt10/research/rngs-gpu-mwc64x.html&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;MWC64X Random Number Generator&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: David Thomas (Public Domain)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;https://github.com/brofield/simpleopt&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;SimpleOpt&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Brodie Thiesfield (MIT License)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style=&quot;-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt; font-weight:600;&quot;&gt;Icons and Palettes Used:&lt;/span&gt;&lt;/p&gt; &lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt; font-weight:600;&quot;&gt;Icons and Palettes Used:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Palettes: &lt;/span&gt;&lt;a href=&quot;https://www.deviantart.com/boxtail&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Boxtail&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;, &lt;/span&gt;&lt;a href=&quot;https://www.deviantart.com/fardareismai&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;FarDareisMai&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;, &lt;/span&gt;&lt;a href=&quot;https://www.deviantart.com/fractaldesire&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;FractalDesire&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;, Rce, &lt;/span&gt;&lt;a href=&quot;https://www.deviantart.com/tatasz&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Tatasz&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt; (Public Domain)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://famfamfam.com&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Silk&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Mark James (Creative Commons Attribution 2.5 License)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://momentumdesignlab.com&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Momentum&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Momentum Design Lab (Creative Commons Attribution-ShareAlike 3.5 License)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://everaldo.com&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Crystal Clear&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Everaldo Coelho (LGPL)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://openiconlibrary.sourceforge.net&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Open Icon Library&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Jeff Israel (GPL, LGPL, Creative Commons, Public Domain)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://icons.mysitemyway.com/category/3d-transparent-glass-icons/&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;3D Transparent Glass&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: iconsETC (Public Domain)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://p.yusukekamiyamane.com&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Fugue&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Yusuke Kamiyamane (Creative Commons Attribution 3.0 License)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> &lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Palettes: &lt;/span&gt;&lt;a href=&quot;https://www.deviantart.com/boxtail&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Boxtail&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;, &lt;/span&gt;&lt;a href=&quot;https://www.deviantart.com/fardareismai&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;FarDareisMai&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;, &lt;/span&gt;&lt;a href=&quot;https://www.deviantart.com/fractaldesire&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;FractalDesire&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;, Rce, &lt;/span&gt;&lt;a href=&quot;https://www.deviantart.com/rubydeva&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Rubydeva&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;, &lt;/span&gt;&lt;a href=&quot;https://www.deviantart.com/tatasz&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Tatasz&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt; (Public Domain)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://famfamfam.com&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Silk&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Mark James (Creative Commons Attribution 2.5 License)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://momentumdesignlab.com&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Momentum&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Momentum Design Lab (Creative Commons Attribution-ShareAlike 3.5 License)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://everaldo.com&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Crystal Clear&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Everaldo Coelho (LGPL)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://openiconlibrary.sourceforge.net&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Open Icon Library&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Jeff Israel (GPL, LGPL, Creative Commons, Public Domain)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://icons.mysitemyway.com/category/3d-transparent-glass-icons/&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;3D Transparent Glass&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: iconsETC (Public Domain)&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://p.yusukekamiyamane.com&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Fugue&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;: Yusuke Kamiyamane (Creative Commons Attribution 3.0 License)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="textInteractionFlags"> <property name="textInteractionFlags">
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set> <set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
@ -140,7 +140,7 @@ p, li { white-space: pre-wrap; }
<rect> <rect>
<x>5</x> <x>5</x>
<y>695</y> <y>695</y>
<width>586</width> <width>681</width>
<height>30</height> <height>30</height>
</rect> </rect>
</property> </property>

View File

@ -444,11 +444,18 @@ bool FinalRenderEmberController<T>::CreateRenderer(eRendererType renderType, con
{ {
m_Renderer.reset(); m_Renderer.reset();
m_Renderers = ::CreateRenderers<T>(renderType, m_Devices, shared, m_OutputTexID, emberReport); m_Renderers = ::CreateRenderers<T>(renderType, m_Devices, shared, m_OutputTexID, emberReport);
for (auto& renderer : m_Renderers)
if (auto rendererCL = dynamic_cast<RendererCLBase*>(renderer.get()))
rendererCL->OptAffine(true);//Optimize empty affines for final renderers, this is normally false for the interactive renderer.
} }
else else
{ {
m_Renderers.clear(); m_Renderers.clear();
m_Renderer = unique_ptr<EmberNs::RendererBase>(::CreateRenderer<T>(renderType, m_Devices, shared, m_OutputTexID, emberReport)); m_Renderer = unique_ptr<EmberNs::RendererBase>(::CreateRenderer<T>(renderType, m_Devices, shared, m_OutputTexID, emberReport));
if (auto rendererCL = dynamic_cast<RendererCLBase*>(m_Renderer.get()))
rendererCL->OptAffine(true);//Optimize empty affines for final renderers, this is normally false for the interactive renderer.
} }
errorReport = emberReport.ErrorReport(); errorReport = emberReport.ErrorReport();

View File

@ -371,7 +371,7 @@ bool Fractorium::eventFilter(QObject* o, QEvent* e)
combo->setCurrentIndex(val); combo->setCurrentIndex(val);
fcount = 0; fcount = 0;
qDebug() << "global function key press: " << ke->key() << " " << o->metaObject()->className() << " " << o->objectName(); //qDebug() << "global function key press: " << ke->key() << " " << o->metaObject()->className() << " " << o->objectName();
} }
return true; return true;
@ -408,7 +408,7 @@ bool Fractorium::eventFilter(QObject* o, QEvent* e)
{ {
xfupcount = 0; xfupcount = 0;
combo->setCurrentIndex((index + 1) % combo->count()); combo->setCurrentIndex((index + 1) % combo->count());
qDebug() << "global arrow plus key press: " << ke->key() << " " << o->metaObject()->className() << " " << o->objectName(); //qDebug() << "global arrow plus key press: " << ke->key() << " " << o->metaObject()->className() << " " << o->objectName();
} }
return true; return true;
@ -425,7 +425,7 @@ bool Fractorium::eventFilter(QObject* o, QEvent* e)
index = combo->count(); index = combo->count();
combo->setCurrentIndex((index - 1) % combo->count()); combo->setCurrentIndex((index - 1) % combo->count());
qDebug() << "global arrow minus key press: " << ke->key() << " " << o->metaObject()->className() << " " << o->objectName(); //qDebug() << "global arrow minus key press: " << ke->key() << " " << o->metaObject()->className() << " " << o->objectName();
} }
return true; return true;

View File

@ -687,12 +687,14 @@ bool Fractorium::CreateRendererFromOptions(bool updatePreviews)
} }
if (auto rendererCL = dynamic_cast<RendererCLBase*>(m_Controller->Renderer())) if (auto rendererCL = dynamic_cast<RendererCLBase*>(m_Controller->Renderer()))
rendererCL->m_CompileBegun = [&]()
{ {
m_RenderStatusLabel->setText("Compiling OpenCL kernel..."); rendererCL->m_CompileBegun = [&]()
m_RenderStatusLabel->repaint(); {
QApplication::processEvents(); m_RenderStatusLabel->setText("Compiling OpenCL kernel...");
}; m_RenderStatusLabel->repaint();
QApplication::processEvents();
};
}
return ok; return ok;
} }