--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

@ -238,6 +238,26 @@
<Component Id="tatasz_pack_03.gradient" Guid="7e5b5ef3-45be-4807-a88f-a8b773663e77">
<File Id="tatasz_pack_03.gradient" Source="$(var.SolutionDir)..\..\..\Data\tatasz_pack_03.gradient" KeyPath="yes" Checksum="yes" ReadOnly="yes"/>
</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">
<File Id="dark_windows.qss" Source="$(var.SolutionDir)..\..\..\Data\dark_windows.qss" KeyPath="yes" Checksum="yes" ReadOnly="yes"/>

View File

@ -67,7 +67,12 @@ $$ASSETS_DIR/tatasz_pack_01.gradient \
$$ASSETS_DIR/tatasz_pack_02_colder.gradient \
$$ASSETS_DIR/tatasz_pack_02_dark.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)
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>
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));
return (A() == 1) &&
(B() == 0) &&
(C() == 0) &&
(D() == 0) &&
(E() == 1) &&
(F() == 0);
}
/// <summary>
@ -165,12 +165,12 @@ bool Affine2D<T>::IsID() const
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));
return (A() == 0) &&
(B() == 0) &&
(C() == 0) &&
(D() == 0) &&
(E() == 0) &&
(F() == 0);
}
/// <summary>

View File

@ -60,7 +60,7 @@ namespace EmberNs
#define XC(c) (reinterpret_cast<const xmlChar*>(c))
#define CX(c) (reinterpret_cast<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 SQR(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;
}
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())
renderers[0]->Callback(progress.get());

View File

@ -73,7 +73,7 @@ static string ConstantDefinesString(bool doublePrecision)
"#define COLORMAP_LENGTH 256u\n"
"#define COLORMAP_LENGTH_MINUS_1 255\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 CUBE(x) ((x) * (x) * (x))\n"
"#define MPI ((real_t)M_PI)\n"

View File

@ -32,10 +32,12 @@ template <typename T> const string& IterOpenCLKernelCreator<T>::IterEntryPoint()
/// </summary>
/// <param name="ember">The ember to create the kernel string for</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>
/// <returns>The kernel string</returns>
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);
size_t i = 0, v, varIndex, varCount;
@ -102,18 +104,19 @@ string IterOpenCLKernelCreator<T>::CreateIterKernelString(const Ember<T>& ember,
}
else
{
/* if (xform->m_Affine.IsID())
{
if (optAffine && xform->m_Affine.IsID())
{
xformFuncs <<
" transX = inPoint->m_X;\n" <<
" transY = inPoint->m_Y;\n";
}
else*/
}
else
{
xformFuncs <<
" 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";
}
xformFuncs <<
" transZ = inPoint->m_Z;\n";
varCount = xform->PreVariationCount();
@ -375,7 +378,7 @@ string IterOpenCLKernelCreator<T>::CreateIterKernelString(const Ember<T>& ember,
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"
//" ok = !BadVal(secondPoint.m_X) && !BadVal(secondPoint.m_Y) && !isnan(secondPoint.m_Z);\n"
"\n"
" if (!ok)\n"
" {\n"
@ -803,9 +806,10 @@ string IterOpenCLKernelCreator<T>::VariationStateInitString(const Ember<T>& embe
/// </summary>
/// <param name="ember1">The first 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>
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();
@ -830,8 +834,8 @@ bool IterOpenCLKernelCreator<T>::IsBuildRequired(const Ember<T>& ember1, const E
auto xform2 = ember2.GetTotalXform(i);
auto varCount = xform1->TotalVariationCount();
//if (xform1->m_Affine.IsID() != xform2->m_Affine.IsID())
// return true;
if (optAffine && (xform1->m_Affine.IsID() != xform2->m_Affine.IsID()))
return true;
if (xform1->HasPost() != xform2->HasPost())
return true;

View File

@ -30,13 +30,13 @@ public:
const string& SumHistKernel() const;
const string& SumHistEntryPoint() 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);
static void ParVarIndexDefines(const Ember<T>& ember, pair<string, vector<T>>& params, bool doVals = true, bool doString = true);
static void SharedDataIndexDefines(const Ember<T>& ember, pair<string, vector<T>>& params, bool doVals = true, bool doString = true);
static string VariationStateString(const Ember<T>& ember);
static string 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:
string CreateZeroizeKernelString() const;

View File

@ -798,7 +798,7 @@ EmberStats RendererCL<T, bucketT>::Iterate(size_t iterCount, size_t temporalSamp
ConvertCarToRas(CoordMap());
//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);
if (b)
@ -905,7 +905,7 @@ bool RendererCL<T, bucketT>::BuildIterProgramForEmber(bool doAccum)
if (b)
{
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";
vector<std::thread> threads;
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)
{
//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();
uint histSuperSize = uint(SuperSize());
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 ClearFinal() { 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;
protected:
bool m_OptAffine = false;
};
/// <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.
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.
return false;

View File

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

View File

@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>596</width>
<width>692</width>
<height>729</height>
</rect>
</property>
@ -39,7 +39,7 @@
<rect>
<x>6</x>
<y>5</y>
<width>583</width>
<width>681</width>
<height>221</height>
</rect>
</property>
@ -87,7 +87,7 @@
<rect>
<x>10</x>
<y>190</y>
<width>586</width>
<width>671</width>
<height>501</height>
</rect>
</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;-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;&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 name="textInteractionFlags">
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
@ -140,7 +140,7 @@ p, li { white-space: pre-wrap; }
<rect>
<x>5</x>
<y>695</y>
<width>586</width>
<width>681</width>
<height>30</height>
</rect>
</property>

View File

@ -444,11 +444,18 @@ bool FinalRenderEmberController<T>::CreateRenderer(eRendererType renderType, con
{
m_Renderer.reset();
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
{
m_Renderers.clear();
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();

View File

@ -371,7 +371,7 @@ bool Fractorium::eventFilter(QObject* o, QEvent* e)
combo->setCurrentIndex(val);
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;
@ -408,7 +408,7 @@ bool Fractorium::eventFilter(QObject* o, QEvent* e)
{
xfupcount = 0;
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;
@ -425,7 +425,7 @@ bool Fractorium::eventFilter(QObject* o, QEvent* e)
index = 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;

View File

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