mirror of
https://bitbucket.org/mfeemster/fractorium.git
synced 2025-01-21 13:10:04 -05:00
--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:
parent
6f11f7df92
commit
55a2c393cf
@ -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"/>
|
||||
|
@ -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
21484
Data/Amphibole_Supergroup.ugr
Normal file
File diff suppressed because it is too large
Load Diff
15196
Data/Apatite_Supergroup.ugr
Normal file
15196
Data/Apatite_Supergroup.ugr
Normal file
File diff suppressed because it is too large
Load Diff
7336
Data/Feldspar_Group.ugr
Normal file
7336
Data/Feldspar_Group.ugr
Normal file
File diff suppressed because it is too large
Load Diff
13100
Data/Mica_Group.ugr
Normal file
13100
Data/Mica_Group.ugr
Normal file
File diff suppressed because it is too large
Load Diff
18340
Data/Quartz_Varieties.ugr
Normal file
18340
Data/Quartz_Varieties.ugr
Normal file
File diff suppressed because it is too large
Load Diff
@ -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>
|
||||
|
@ -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))
|
||||
|
@ -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());
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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()));
|
||||
|
@ -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>
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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; }
|
||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.qt.io/developers/"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">Qt</span></a><span style=" font-size:10pt;">: Digia Plc (GPL v3, LGPL v2)<br /></span><a href="http://g-truc.net"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">glm</span></a><span style=" font-size:10pt;">: Christophe Riccio (MIT License)<br /></span><a href="http://threadingbuildingblocks.org"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">Threading Building Blocks</span></a><span style=" font-size:10pt;">: Intel Corporation (GPLv2)<br /></span><a href="http://libjpeg.sourceforge.net"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">libjpeg</span></a><span style=" font-size:10pt;">: Independent JPEG Group (Free Software License)<br /></span><a href="http://libpng.org"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">libpng</span></a><span style=" font-size:10pt;">: Glenn Randers-Pehrson et al (Libpng License)<br /></span><a href="http://xmlsoft.org"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">libxml2</span></a><span style=" font-size:10pt;">: Daniel Veillard (MIT License)<br /></span><a href="http://zlib.net"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">zlib</span></a><span style=" font-size:10pt;">: Jean-loup Gailly, Mark Adler (Zlib License)<br /></span><a href="http://burtleburtle.net/bob/cplus/isaac.hpp"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">QTIsaac</span></a><span style=" font-size:10pt;">: Robert J. Jenkins, Quinn Tyler Jackson (Public Domain)<br /></span><a href="http://cas.ee.ic.ac.uk/people/dt10/research/rngs-gpu-mwc64x.html"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">MWC64X Random Number Generator</span></a><span style=" font-size:10pt;">: David Thomas (Public Domain)<br /></span><a href="https://github.com/brofield/simpleopt"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">SimpleOpt</span></a><span style=" font-size:10pt;">: Brodie Thiesfield (MIT License)</span></p>
|
||||
<p style="-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;"><br /></p>
|
||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Icons and Palettes Used:</span></p>
|
||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Palettes: </span><a href="https://www.deviantart.com/boxtail"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">Boxtail</span></a><span style=" font-size:10pt;">, </span><a href="https://www.deviantart.com/fardareismai"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">FarDareisMai</span></a><span style=" font-size:10pt;">, </span><a href="https://www.deviantart.com/fractaldesire"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">FractalDesire</span></a><span style=" font-size:10pt;">, Rce, </span><a href="https://www.deviantart.com/tatasz"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">Tatasz</span></a><span style=" font-size:10pt;"> (Public Domain)<br /></span><a href="http://famfamfam.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">Silk</span></a><span style=" font-size:10pt;">: Mark James (Creative Commons Attribution 2.5 License)<br /></span><a href="http://momentumdesignlab.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">Momentum</span></a><span style=" font-size:10pt;">: Momentum Design Lab (Creative Commons Attribution-ShareAlike 3.5 License)<br /></span><a href="http://everaldo.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">Crystal Clear</span></a><span style=" font-size:10pt;">: Everaldo Coelho (LGPL)<br /></span><a href="http://openiconlibrary.sourceforge.net"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">Open Icon Library</span></a><span style=" font-size:10pt;">: Jeff Israel (GPL, LGPL, Creative Commons, Public Domain)<br /></span><a href="http://icons.mysitemyway.com/category/3d-transparent-glass-icons/"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">3D Transparent Glass</span></a><span style=" font-size:10pt;">: iconsETC (Public Domain)<br /></span><a href="http://p.yusukekamiyamane.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">Fugue</span></a><span style=" font-size:10pt;">: Yusuke Kamiyamane (Creative Commons Attribution 3.0 License)</span></p></body></html></string>
|
||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Palettes: </span><a href="https://www.deviantart.com/boxtail"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">Boxtail</span></a><span style=" font-size:10pt;">, </span><a href="https://www.deviantart.com/fardareismai"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">FarDareisMai</span></a><span style=" font-size:10pt;">, </span><a href="https://www.deviantart.com/fractaldesire"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">FractalDesire</span></a><span style=" font-size:10pt;">, Rce, </span><a href="https://www.deviantart.com/rubydeva"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">Rubydeva</span></a><span style=" font-size:10pt;">, </span><a href="https://www.deviantart.com/tatasz"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">Tatasz</span></a><span style=" font-size:10pt;"> (Public Domain)<br /></span><a href="http://famfamfam.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">Silk</span></a><span style=" font-size:10pt;">: Mark James (Creative Commons Attribution 2.5 License)<br /></span><a href="http://momentumdesignlab.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">Momentum</span></a><span style=" font-size:10pt;">: Momentum Design Lab (Creative Commons Attribution-ShareAlike 3.5 License)<br /></span><a href="http://everaldo.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">Crystal Clear</span></a><span style=" font-size:10pt;">: Everaldo Coelho (LGPL)<br /></span><a href="http://openiconlibrary.sourceforge.net"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">Open Icon Library</span></a><span style=" font-size:10pt;">: Jeff Israel (GPL, LGPL, Creative Commons, Public Domain)<br /></span><a href="http://icons.mysitemyway.com/category/3d-transparent-glass-icons/"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">3D Transparent Glass</span></a><span style=" font-size:10pt;">: iconsETC (Public Domain)<br /></span><a href="http://p.yusukekamiyamane.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">Fugue</span></a><span style=" font-size:10pt;">: Yusuke Kamiyamane (Creative Commons Attribution 3.0 License)</span></p></body></html></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>
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user