mirror of
https://bitbucket.org/mfeemster/fractorium.git
synced 2025-02-01 10:30:08 -05:00
Merge branch 'master' into travis
This commit is contained in:
commit
3fc1645b7a
@ -803,6 +803,9 @@ public:
|
|||||||
InterpT<&Ember<T>::m_SpatialFilterRadius>(embers, coefs, size);
|
InterpT<&Ember<T>::m_SpatialFilterRadius>(embers, coefs, size);
|
||||||
InterpX<Curves<T>, &Ember<T>::m_Curves>(embers, coefs, size);
|
InterpX<Curves<T>, &Ember<T>::m_Curves>(embers, coefs, size);
|
||||||
|
|
||||||
|
//Normally done in assignment, must manually do here.
|
||||||
|
SetProjFunc();
|
||||||
|
|
||||||
//An extra step needed here due to the OOD that was not needed in the original.
|
//An extra step needed here due to the OOD that was not needed in the original.
|
||||||
//A small price to pay for the conveniences it affords us elsewhere.
|
//A small price to pay for the conveniences it affords us elsewhere.
|
||||||
//First clear the xforms, and find out the max number of xforms in all of the embers in the list.
|
//First clear the xforms, and find out the max number of xforms in all of the embers in the list.
|
||||||
|
@ -1217,6 +1217,8 @@ EmberStats Renderer<T, bucketT>::Iterate(size_t iterCount, size_t temporalSample
|
|||||||
#endif
|
#endif
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
SetThreadPriority(GetCurrentThread(), m_Priority);
|
SetThreadPriority(GetCurrentThread(), m_Priority);
|
||||||
|
#else
|
||||||
|
pthread_setschedprio(pthread_self(), (int)m_Priority);
|
||||||
#endif
|
#endif
|
||||||
//Timing t;
|
//Timing t;
|
||||||
IterParams<T> params;
|
IterParams<T> params;
|
||||||
|
@ -239,7 +239,7 @@ public:
|
|||||||
m_BadVariationNames.push_back(make_pair(make_pair(string("post_dcztransl"), string("post_dc_ztransl")), badParams));
|
m_BadVariationNames.push_back(make_pair(make_pair(string("post_dcztransl"), string("post_dc_ztransl")), badParams));
|
||||||
badParams.clear();
|
badParams.clear();
|
||||||
|
|
||||||
m_BadVariationNames.push_back(make_pair(make_pair(string("pre_blur"), string("pre_gaussian_blur")), badParams));
|
m_BadVariationNames.push_back(make_pair(make_pair(string("pre_blur"), string("pre_gaussian_blur")), badParams));//No other special params for these.
|
||||||
m_BadVariationNames.push_back(make_pair(make_pair(string("pre_spin_z"), string("pre_rotate_z")), badParams));
|
m_BadVariationNames.push_back(make_pair(make_pair(string("pre_spin_z"), string("pre_rotate_z")), badParams));
|
||||||
m_BadVariationNames.push_back(make_pair(make_pair(string("post_spin_z"), string("post_rotate_z")), badParams));
|
m_BadVariationNames.push_back(make_pair(make_pair(string("post_spin_z"), string("post_rotate_z")), badParams));
|
||||||
|
|
||||||
@ -546,6 +546,7 @@ private:
|
|||||||
bool ParseEmberElement(xmlNode* emberNode, Ember<T>& currentEmber)
|
bool ParseEmberElement(xmlNode* emberNode, Ember<T>& currentEmber)
|
||||||
{
|
{
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
|
bool fromEmber = false;
|
||||||
uint newLinear = 0;
|
uint newLinear = 0;
|
||||||
char* attStr;
|
char* attStr;
|
||||||
const char* loc = __FUNCTION__;
|
const char* loc = __FUNCTION__;
|
||||||
@ -639,6 +640,11 @@ private:
|
|||||||
currentEmber.m_Name = string(attStr);
|
currentEmber.m_Name = string(attStr);
|
||||||
std::replace(currentEmber.m_Name.begin(), currentEmber.m_Name.end(), ' ', '_');
|
std::replace(currentEmber.m_Name.begin(), currentEmber.m_Name.end(), ' ', '_');
|
||||||
}
|
}
|
||||||
|
else if (!Compare(curAtt->name, "version"))
|
||||||
|
{
|
||||||
|
if (ToLower(string(attStr)).find_first_of("ember") != string::npos)
|
||||||
|
fromEmber = true;
|
||||||
|
}
|
||||||
else if (!Compare(curAtt->name, "size"))
|
else if (!Compare(curAtt->name, "size"))
|
||||||
{
|
{
|
||||||
if (sscanf_s(attStr, "%lu %lu", ¤tEmber.m_FinalRasW, ¤tEmber.m_FinalRasH) != 2)
|
if (sscanf_s(attStr, "%lu %lu", ¤tEmber.m_FinalRasW, ¤tEmber.m_FinalRasH) != 2)
|
||||||
@ -931,7 +937,7 @@ private:
|
|||||||
{
|
{
|
||||||
Xform<T> finalXform;
|
Xform<T> finalXform;
|
||||||
|
|
||||||
if (!ParseXform(childNode, finalXform, false))
|
if (!ParseXform(childNode, finalXform, false, fromEmber))
|
||||||
{
|
{
|
||||||
m_ErrorReport.push_back(string(loc) + " : Error parsing final xform");
|
m_ErrorReport.push_back(string(loc) + " : Error parsing final xform");
|
||||||
}
|
}
|
||||||
@ -951,7 +957,7 @@ private:
|
|||||||
{
|
{
|
||||||
Xform<T> xform;
|
Xform<T> xform;
|
||||||
|
|
||||||
if (!ParseXform(childNode, xform, false))
|
if (!ParseXform(childNode, xform, false, fromEmber))
|
||||||
{
|
{
|
||||||
m_ErrorReport.push_back(string(loc) + " : Error parsing xform");
|
m_ErrorReport.push_back(string(loc) + " : Error parsing xform");
|
||||||
}
|
}
|
||||||
@ -977,7 +983,7 @@ private:
|
|||||||
{
|
{
|
||||||
Xform<T> xform(false);//Will only have valid values in fields parsed for motion, all others will be EMPTYFIELD.
|
Xform<T> xform(false);//Will only have valid values in fields parsed for motion, all others will be EMPTYFIELD.
|
||||||
|
|
||||||
if (!ParseXform(motionNode, xform, true))
|
if (!ParseXform(motionNode, xform, true, fromEmber))
|
||||||
m_ErrorReport.push_back(string(loc) + " : Error parsing motion xform");
|
m_ErrorReport.push_back(string(loc) + " : Error parsing motion xform");
|
||||||
else
|
else
|
||||||
theXform->m_Motion.push_back(xform);
|
theXform->m_Motion.push_back(xform);
|
||||||
@ -1011,7 +1017,7 @@ private:
|
|||||||
/// <param name="xform">The newly constructed xform based on what was parsed</param>
|
/// <param name="xform">The newly constructed xform based on what was parsed</param>
|
||||||
/// <param name="motion">True if this xform is a motion within a parent xform, else false</param>
|
/// <param name="motion">True if this xform is a motion within a parent xform, else false</param>
|
||||||
/// <returns>True if there were no errors, else false.</returns>
|
/// <returns>True if there were no errors, else false.</returns>
|
||||||
bool ParseXform(xmlNode* childNode, Xform<T>& xform, bool motion)
|
bool ParseXform(xmlNode* childNode, Xform<T>& xform, bool motion, bool fromEmber)
|
||||||
{
|
{
|
||||||
bool success = true;
|
bool success = true;
|
||||||
char* attStr;
|
char* attStr;
|
||||||
@ -1145,7 +1151,8 @@ private:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string s = GetCorrectedVariationName(m_BadVariationNames, curAtt);
|
//Only correct names if it came from an outside source. Names originating from this library are always considered correct.
|
||||||
|
string s = fromEmber ? string(CCX(curAtt->name)) : GetCorrectedVariationName(m_BadVariationNames, curAtt);
|
||||||
|
|
||||||
if (Variation<T>* var = m_VariationList.GetVariation(s))
|
if (Variation<T>* var = m_VariationList.GetVariation(s))
|
||||||
{
|
{
|
||||||
@ -1164,7 +1171,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Handle var1.
|
//Handle var1.
|
||||||
for (curAtt = attPtr; curAtt; curAtt = curAtt->next)
|
for (curAtt = attPtr; curAtt; curAtt = curAtt->next)//Legacy fields, most likely not used.
|
||||||
{
|
{
|
||||||
bool var1 = false;
|
bool var1 = false;
|
||||||
|
|
||||||
@ -1195,7 +1202,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Handle var.
|
//Handle var.
|
||||||
for (curAtt = attPtr; curAtt; curAtt = curAtt->next)
|
for (curAtt = attPtr; curAtt; curAtt = curAtt->next)//Legacy fields, most likely not used.
|
||||||
{
|
{
|
||||||
bool var = false;
|
bool var = false;
|
||||||
|
|
||||||
@ -1226,7 +1233,8 @@ private:
|
|||||||
{
|
{
|
||||||
for (curAtt = attPtr; curAtt; curAtt = curAtt->next)
|
for (curAtt = attPtr; curAtt; curAtt = curAtt->next)
|
||||||
{
|
{
|
||||||
string s = GetCorrectedParamName(m_BadParamNames, CCX(curAtt->name));
|
//Only correct names if it came from an outside source. Names originating from this library are always considered correct.
|
||||||
|
string s = fromEmber ? string(CCX(curAtt->name)) : GetCorrectedParamName(m_BadParamNames, CCX(curAtt->name));
|
||||||
const char* name = s.c_str();
|
const char* name = s.c_str();
|
||||||
|
|
||||||
if (parVar->ContainsParam(name))
|
if (parVar->ContainsParam(name))
|
||||||
|
@ -258,7 +258,7 @@ bool EmberAnimate(EmberOptions& opt)
|
|||||||
renderer->Transparency(opt.Transparency());
|
renderer->Transparency(opt.Transparency());
|
||||||
renderer->NumChannels(channels);
|
renderer->NumChannels(channels);
|
||||||
renderer->BytesPerChannel(opt.BitsPerChannel() / 8);
|
renderer->BytesPerChannel(opt.BitsPerChannel() / 8);
|
||||||
renderer->Priority((eThreadPriority)Clamp<uint>((uint)eThreadPriority::LOWEST, (uint)eThreadPriority::HIGHEST, opt.Priority()));
|
renderer->Priority((eThreadPriority)Clamp<int>((int)eThreadPriority::LOWEST, (int)eThreadPriority::HIGHEST, opt.Priority()));
|
||||||
renderer->Callback(opt.DoProgress() ? progress.get() : nullptr);
|
renderer->Callback(opt.DoProgress() ? progress.get() : nullptr);
|
||||||
|
|
||||||
std::function<void(uint)> saveFunc = [&](uint threadVecIndex)
|
std::function<void(uint)> saveFunc = [&](uint threadVecIndex)
|
||||||
|
@ -326,9 +326,16 @@ public:
|
|||||||
INITBOOLOPTION(DumpKernel, Eob(OPT_USE_RENDER, OPT_DUMP_KERNEL, _T("--dump_kernel"), false, SO_NONE, "\t--dump_kernel Print the iteration kernel string when using OpenCL (ignored for CPU) [default: false].\n"));
|
INITBOOLOPTION(DumpKernel, Eob(OPT_USE_RENDER, OPT_DUMP_KERNEL, _T("--dump_kernel"), false, SO_NONE, "\t--dump_kernel Print the iteration kernel string when using OpenCL (ignored for CPU) [default: false].\n"));
|
||||||
|
|
||||||
//Int.
|
//Int.
|
||||||
INITINTOPTION(Symmetry, Eoi(OPT_USE_GENOME, OPT_SYMMETRY, _T("--symmetry"), 0, SO_REQ_SEP, "\t--symmetry=<val> Set symmetry of result [default: 0].\n"));
|
INITINTOPTION(Symmetry, Eoi(OPT_USE_GENOME, OPT_SYMMETRY, _T("--symmetry"), 0, SO_REQ_SEP, "\t--symmetry=<val> Set symmetry of result [default: 0].\n"));
|
||||||
INITINTOPTION(SheepGen, Eoi(OPT_USE_GENOME, OPT_SHEEP_GEN, _T("--sheep_gen"), -1, SO_REQ_SEP, "\t--sheep_gen=<val> Sheep generation of this flame [default: -1].\n"));
|
INITINTOPTION(SheepGen, Eoi(OPT_USE_GENOME, OPT_SHEEP_GEN, _T("--sheep_gen"), -1, SO_REQ_SEP, "\t--sheep_gen=<val> Sheep generation of this flame [default: -1].\n"));
|
||||||
INITINTOPTION(SheepId, Eoi(OPT_USE_GENOME, OPT_SHEEP_ID, _T("--sheep_id"), -1, SO_REQ_SEP, "\t--sheep_id=<val> Sheep ID of this flame [default: -1].\n"));
|
INITINTOPTION(SheepId, Eoi(OPT_USE_GENOME, OPT_SHEEP_ID, _T("--sheep_id"), -1, SO_REQ_SEP, "\t--sheep_id=<val> Sheep ID of this flame [default: -1].\n"));
|
||||||
|
#ifdef _WIN32
|
||||||
|
INITINTOPTION(Priority, Eoi(OPT_RENDER_ANIM, OPT_PRIORITY, _T("--priority"), eThreadPriority::NORMAL, SO_REQ_SEP, "\t--priority=<val> The priority of the CPU rendering threads from -2 - 2. This does not apply to OpenCL rendering.\n"));
|
||||||
|
#else
|
||||||
|
INITINTOPTION(Priority, Eoi(OPT_RENDER_ANIM, OPT_PRIORITY, _T("--priority"), eThreadPriority::NORMAL, SO_REQ_SEP, "\t--priority=<val> The priority of the CPU rendering threads, 1, 25, 50, 75, 99. This does not apply to OpenCL rendering.\n"));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Uint.
|
||||||
INITUINTOPTION(Platform, Eou(OPT_USE_ALL, OPT_OPENCL_PLATFORM, _T("--platform"), 0, SO_REQ_SEP, "\t--platform The OpenCL platform index to use [default: 0].\n"));
|
INITUINTOPTION(Platform, Eou(OPT_USE_ALL, OPT_OPENCL_PLATFORM, _T("--platform"), 0, SO_REQ_SEP, "\t--platform The OpenCL platform index to use [default: 0].\n"));
|
||||||
INITUINTOPTION(Device, Eou(OPT_USE_ALL, OPT_OPENCL_DEVICE, _T("--device"), 0, SO_REQ_SEP, "\t--device The OpenCL device index within the specified platform to use [default: 0].\n"));
|
INITUINTOPTION(Device, Eou(OPT_USE_ALL, OPT_OPENCL_DEVICE, _T("--device"), 0, SO_REQ_SEP, "\t--device The OpenCL device index within the specified platform to use [default: 0].\n"));
|
||||||
INITUINTOPTION(Seed, Eou(OPT_USE_ALL, OPT_SEED, _T("--seed"), 0, SO_REQ_SEP, "\t--seed=<val> Integer seed to use for the random number generator [default: random].\n"));
|
INITUINTOPTION(Seed, Eou(OPT_USE_ALL, OPT_SEED, _T("--seed"), 0, SO_REQ_SEP, "\t--seed=<val> Integer seed to use for the random number generator [default: random].\n"));
|
||||||
@ -354,7 +361,6 @@ public:
|
|||||||
INITUINTOPTION(Repeat, Eou(OPT_USE_GENOME, OPT_REPEAT, _T("--repeat"), 1, SO_REQ_SEP, "\t--repeat=<val> Number of new flames to create. Ignored if sequence, inter or rotate were specified [default: 1].\n"));
|
INITUINTOPTION(Repeat, Eou(OPT_USE_GENOME, OPT_REPEAT, _T("--repeat"), 1, SO_REQ_SEP, "\t--repeat=<val> Number of new flames to create. Ignored if sequence, inter or rotate were specified [default: 1].\n"));
|
||||||
INITUINTOPTION(Tries, Eou(OPT_USE_GENOME, OPT_TRIES, _T("--tries"), 10, SO_REQ_SEP, "\t--tries=<val> Number times to try creating a flame that meets the specified constraints. Ignored if sequence, inter or rotate were specified [default: 10].\n"));
|
INITUINTOPTION(Tries, Eou(OPT_USE_GENOME, OPT_TRIES, _T("--tries"), 10, SO_REQ_SEP, "\t--tries=<val> Number times to try creating a flame that meets the specified constraints. Ignored if sequence, inter or rotate were specified [default: 10].\n"));
|
||||||
INITUINTOPTION(MaxXforms, Eou(OPT_USE_GENOME, OPT_MAX_XFORMS, _T("--maxxforms"), UINT_MAX, SO_REQ_SEP, "\t--maxxforms=<val> The maximum number of xforms allowed in the final output.\n"));
|
INITUINTOPTION(MaxXforms, Eou(OPT_USE_GENOME, OPT_MAX_XFORMS, _T("--maxxforms"), UINT_MAX, SO_REQ_SEP, "\t--maxxforms=<val> The maximum number of xforms allowed in the final output.\n"));
|
||||||
INITUINTOPTION(Priority, Eou(OPT_RENDER_ANIM, OPT_PRIORITY, _T("--priority"), eThreadPriority::NORMAL, SO_REQ_SEP, "\t--priority=<val> The priority of the CPU rendering threads from -2 - 2. This does not apply to OpenCL rendering.\n"));
|
|
||||||
|
|
||||||
//Double.
|
//Double.
|
||||||
INITDOUBLEOPTION(SizeScale, Eod(OPT_RENDER_ANIM, OPT_SS, _T("--ss"), 1, SO_REQ_SEP, "\t--ss=<val> Size scale. All dimensions are scaled by this amount [default: 1.0].\n"));
|
INITDOUBLEOPTION(SizeScale, Eod(OPT_RENDER_ANIM, OPT_SS, _T("--ss"), 1, SO_REQ_SEP, "\t--ss=<val> Size scale. All dimensions are scaled by this amount [default: 1.0].\n"));
|
||||||
@ -463,6 +469,7 @@ public:
|
|||||||
PARSEINTOPTION(OPT_SYMMETRY, Symmetry);//Int args
|
PARSEINTOPTION(OPT_SYMMETRY, Symmetry);//Int args
|
||||||
PARSEINTOPTION(OPT_SHEEP_GEN, SheepGen);
|
PARSEINTOPTION(OPT_SHEEP_GEN, SheepGen);
|
||||||
PARSEINTOPTION(OPT_SHEEP_ID, SheepId);
|
PARSEINTOPTION(OPT_SHEEP_ID, SheepId);
|
||||||
|
PARSEINTOPTION(OPT_PRIORITY, Priority);
|
||||||
PARSEUINTOPTION(OPT_OPENCL_PLATFORM, Platform);//uint args.
|
PARSEUINTOPTION(OPT_OPENCL_PLATFORM, Platform);//uint args.
|
||||||
PARSEUINTOPTION(OPT_OPENCL_DEVICE, Device);
|
PARSEUINTOPTION(OPT_OPENCL_DEVICE, Device);
|
||||||
PARSEUINTOPTION(OPT_SEED, Seed);
|
PARSEUINTOPTION(OPT_SEED, Seed);
|
||||||
@ -484,7 +491,6 @@ public:
|
|||||||
PARSEUINTOPTION(OPT_REPEAT, Repeat);
|
PARSEUINTOPTION(OPT_REPEAT, Repeat);
|
||||||
PARSEUINTOPTION(OPT_TRIES, Tries);
|
PARSEUINTOPTION(OPT_TRIES, Tries);
|
||||||
PARSEUINTOPTION(OPT_MAX_XFORMS, MaxXforms);
|
PARSEUINTOPTION(OPT_MAX_XFORMS, MaxXforms);
|
||||||
PARSEUINTOPTION(OPT_PRIORITY, Priority);
|
|
||||||
|
|
||||||
PARSEDOUBLEOPTION(OPT_SS, SizeScale);//Float args.
|
PARSEDOUBLEOPTION(OPT_SS, SizeScale);//Float args.
|
||||||
PARSEDOUBLEOPTION(OPT_QS, QualityScale);
|
PARSEDOUBLEOPTION(OPT_QS, QualityScale);
|
||||||
@ -679,6 +685,7 @@ public:
|
|||||||
EmberOptionEntry<int> Symmetry;//Value int.
|
EmberOptionEntry<int> Symmetry;//Value int.
|
||||||
EmberOptionEntry<int> SheepGen;
|
EmberOptionEntry<int> SheepGen;
|
||||||
EmberOptionEntry<int> SheepId;
|
EmberOptionEntry<int> SheepId;
|
||||||
|
EmberOptionEntry<int> Priority;
|
||||||
EmberOptionEntry<uint> Platform;//Value uint.
|
EmberOptionEntry<uint> Platform;//Value uint.
|
||||||
EmberOptionEntry<uint> Device;
|
EmberOptionEntry<uint> Device;
|
||||||
EmberOptionEntry<uint> Seed;
|
EmberOptionEntry<uint> Seed;
|
||||||
@ -700,7 +707,6 @@ public:
|
|||||||
EmberOptionEntry<uint> Repeat;
|
EmberOptionEntry<uint> Repeat;
|
||||||
EmberOptionEntry<uint> Tries;
|
EmberOptionEntry<uint> Tries;
|
||||||
EmberOptionEntry<uint> MaxXforms;
|
EmberOptionEntry<uint> MaxXforms;
|
||||||
EmberOptionEntry<uint> Priority;
|
|
||||||
|
|
||||||
EmberOptionEntry<double> SizeScale;//Value double.
|
EmberOptionEntry<double> SizeScale;//Value double.
|
||||||
EmberOptionEntry<double> QualityScale;
|
EmberOptionEntry<double> QualityScale;
|
||||||
|
@ -154,7 +154,7 @@ bool EmberRender(EmberOptions& opt)
|
|||||||
renderer->Transparency(opt.Transparency());
|
renderer->Transparency(opt.Transparency());
|
||||||
renderer->NumChannels(channels);
|
renderer->NumChannels(channels);
|
||||||
renderer->BytesPerChannel(opt.BitsPerChannel() / 8);
|
renderer->BytesPerChannel(opt.BitsPerChannel() / 8);
|
||||||
renderer->Priority((eThreadPriority)Clamp<uint>((uint)eThreadPriority::LOWEST, (uint)eThreadPriority::HIGHEST, opt.Priority()));
|
renderer->Priority((eThreadPriority)Clamp<int>((int)eThreadPriority::LOWEST, (int)eThreadPriority::HIGHEST, opt.Priority()));
|
||||||
renderer->Callback(opt.DoProgress() ? progress.get() : nullptr);
|
renderer->Callback(opt.DoProgress() ? progress.get() : nullptr);
|
||||||
|
|
||||||
for (i = 0; i < embers.size(); i++)
|
for (i = 0; i < embers.size(); i++)
|
||||||
|
@ -118,7 +118,18 @@ FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(FractoriumSettings* set
|
|||||||
ui.FinalRenderDoSequenceCheckBox->setChecked( m_Settings->FinalDoSequence());
|
ui.FinalRenderDoSequenceCheckBox->setChecked( m_Settings->FinalDoSequence());
|
||||||
ui.FinalRenderKeepAspectCheckBox->setChecked( m_Settings->FinalKeepAspect());
|
ui.FinalRenderKeepAspectCheckBox->setChecked( m_Settings->FinalKeepAspect());
|
||||||
ui.FinalRenderThreadCountSpin->setValue( m_Settings->FinalThreadCount());
|
ui.FinalRenderThreadCountSpin->setValue( m_Settings->FinalThreadCount());
|
||||||
|
#ifdef _WIN32
|
||||||
ui.FinalRenderThreadPriorityComboBox->setCurrentIndex(m_Settings->FinalThreadPriority() + 2);
|
ui.FinalRenderThreadPriorityComboBox->setCurrentIndex(m_Settings->FinalThreadPriority() + 2);
|
||||||
|
#else
|
||||||
|
auto tpc = ui.FinalRenderThreadPriorityComboBox->count() - 1;
|
||||||
|
|
||||||
|
if (m_Settings->FinalThreadPriority() == THREAD_PRIORITY_LOWEST)
|
||||||
|
ui.FinalRenderThreadPriorityComboBox->setCurrentIndex(0);
|
||||||
|
else if (m_Settings->FinalThreadPriority() == THREAD_PRIORITY_HIGHEST)
|
||||||
|
ui.FinalRenderThreadPriorityComboBox->setCurrentIndex(tpc);
|
||||||
|
else
|
||||||
|
ui.FinalRenderThreadPriorityComboBox->setCurrentIndex(Clamp<int>(0, tpc, m_Settings->FinalThreadPriority() / 25));
|
||||||
|
#endif
|
||||||
|
|
||||||
m_QualitySpin->setValue(m_Settings->FinalQuality());
|
m_QualitySpin->setValue(m_Settings->FinalQuality());
|
||||||
m_TemporalSamplesSpin->setValue(m_Settings->FinalTemporalSamples());
|
m_TemporalSamplesSpin->setValue(m_Settings->FinalTemporalSamples());
|
||||||
@ -206,7 +217,19 @@ uint FractoriumFinalRenderDialog::Current() { return ui.FinalRenderCurrentSpin->
|
|||||||
uint FractoriumFinalRenderDialog::PlatformIndex() { return ui.FinalRenderPlatformCombo->currentIndex(); }
|
uint FractoriumFinalRenderDialog::PlatformIndex() { return ui.FinalRenderPlatformCombo->currentIndex(); }
|
||||||
uint FractoriumFinalRenderDialog::DeviceIndex() { return ui.FinalRenderDeviceCombo->currentIndex(); }
|
uint FractoriumFinalRenderDialog::DeviceIndex() { return ui.FinalRenderDeviceCombo->currentIndex(); }
|
||||||
uint FractoriumFinalRenderDialog::ThreadCount() { return ui.FinalRenderThreadCountSpin->value(); }
|
uint FractoriumFinalRenderDialog::ThreadCount() { return ui.FinalRenderThreadCountSpin->value(); }
|
||||||
uint FractoriumFinalRenderDialog::ThreadPriority() { return ui.FinalRenderThreadPriorityComboBox->currentIndex() - 2; }
|
#ifdef _WIN32
|
||||||
|
int FractoriumFinalRenderDialog::ThreadPriority() { return ui.FinalRenderThreadPriorityComboBox->currentIndex() - 2; }
|
||||||
|
#else
|
||||||
|
int FractoriumFinalRenderDialog::ThreadPriority()
|
||||||
|
{
|
||||||
|
if (ui.FinalRenderThreadPriorityComboBox->currentIndex() == 0)
|
||||||
|
return THREAD_PRIORITY_LOWEST;
|
||||||
|
else if (ui.FinalRenderThreadPriorityComboBox->currentIndex() == (ui.FinalRenderThreadPriorityComboBox->count() - 1))
|
||||||
|
return THREAD_PRIORITY_HIGHEST;
|
||||||
|
else
|
||||||
|
return ui.FinalRenderThreadPriorityComboBox->currentIndex() * 25;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
double FractoriumFinalRenderDialog::WidthScale() { return m_WidthScaleSpin->value(); }
|
double FractoriumFinalRenderDialog::WidthScale() { return m_WidthScaleSpin->value(); }
|
||||||
double FractoriumFinalRenderDialog::HeightScale() { return m_HeightScaleSpin->value(); }
|
double FractoriumFinalRenderDialog::HeightScale() { return m_HeightScaleSpin->value(); }
|
||||||
double FractoriumFinalRenderDialog::Quality() { return m_QualitySpin->value(); }
|
double FractoriumFinalRenderDialog::Quality() { return m_QualitySpin->value(); }
|
||||||
|
@ -68,7 +68,7 @@ public:
|
|||||||
uint PlatformIndex();
|
uint PlatformIndex();
|
||||||
uint DeviceIndex();
|
uint DeviceIndex();
|
||||||
uint ThreadCount();
|
uint ThreadCount();
|
||||||
uint ThreadPriority();
|
int ThreadPriority();
|
||||||
double WidthScale();
|
double WidthScale();
|
||||||
double HeightScale();
|
double HeightScale();
|
||||||
double Quality();
|
double Quality();
|
||||||
|
@ -174,7 +174,7 @@ FinalRenderEmberController<T>::FinalRenderEmberController(FractoriumFinalRenderD
|
|||||||
m_Renderer->Transparency(m_GuiState.m_Transparency);
|
m_Renderer->Transparency(m_GuiState.m_Transparency);
|
||||||
m_Renderer->m_ProgressParameter = reinterpret_cast<void*>(¤tStripForProgress);
|
m_Renderer->m_ProgressParameter = reinterpret_cast<void*>(¤tStripForProgress);
|
||||||
|
|
||||||
if (path.endsWith(".png", Qt::CaseInsensitive) || m_Renderer->RendererType() == OPENCL_RENDERER)//This is creating the wrong thing.//TODO
|
if (path.endsWith(".png", Qt::CaseInsensitive) || m_Renderer->RendererType() == OPENCL_RENDERER)
|
||||||
m_Renderer->NumChannels(4);
|
m_Renderer->NumChannels(4);
|
||||||
else
|
else
|
||||||
m_Renderer->NumChannels(3);
|
m_Renderer->NumChannels(3);
|
||||||
|
@ -38,7 +38,7 @@ struct FinalRenderGuiState
|
|||||||
uint m_PlatformIndex;
|
uint m_PlatformIndex;
|
||||||
uint m_DeviceIndex;
|
uint m_DeviceIndex;
|
||||||
uint m_ThreadCount;
|
uint m_ThreadCount;
|
||||||
uint m_ThreadPriority;
|
int m_ThreadPriority;
|
||||||
double m_WidthScale;
|
double m_WidthScale;
|
||||||
double m_HeightScale;
|
double m_HeightScale;
|
||||||
double m_Quality;
|
double m_Quality;
|
||||||
|
@ -23,7 +23,24 @@ Fractorium::Fractorium(QWidget* p)
|
|||||||
qRegisterMetaType<QVector<int>>("QVector<int>");//For previews.
|
qRegisterMetaType<QVector<int>>("QVector<int>");//For previews.
|
||||||
qRegisterMetaType<vector<byte>>("vector<byte>");
|
qRegisterMetaType<vector<byte>>("vector<byte>");
|
||||||
qRegisterMetaType<EmberTreeWidgetItemBase*>("EmberTreeWidgetItemBase*");
|
qRegisterMetaType<EmberTreeWidgetItemBase*>("EmberTreeWidgetItemBase*");
|
||||||
|
|
||||||
|
setDockOptions(DockOption::AllowNestedDocks | DockOption::AllowTabbedDocks);
|
||||||
|
setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::TabPosition::North);
|
||||||
|
setTabShape(QTabWidget::TabShape::Triangular);
|
||||||
|
tabifyDockWidget(ui.LibraryDockWidget, ui.FlameDockWidget);
|
||||||
|
tabifyDockWidget(ui.FlameDockWidget, ui.XformsDockWidget);
|
||||||
|
tabifyDockWidget(ui.XformsDockWidget, ui.XaosDockWidget);
|
||||||
|
tabifyDockWidget(ui.XaosDockWidget, ui.PaletteDockWidget);
|
||||||
|
tabifyDockWidget(ui.PaletteDockWidget, ui.InfoDockWidget);
|
||||||
|
|
||||||
|
m_Docks.reserve(8);
|
||||||
|
m_Docks.push_back(ui.LibraryDockWidget);
|
||||||
|
m_Docks.push_back(ui.FlameDockWidget);
|
||||||
|
m_Docks.push_back(ui.XformsDockWidget);
|
||||||
|
m_Docks.push_back(ui.XaosDockWidget);
|
||||||
|
m_Docks.push_back(ui.PaletteDockWidget);
|
||||||
|
m_Docks.push_back(ui.InfoDockWidget);
|
||||||
|
|
||||||
m_FontSize = 9;
|
m_FontSize = 9;
|
||||||
m_VarSortMode = 1;//Sort by weight by default.
|
m_VarSortMode = 1;//Sort by weight by default.
|
||||||
m_PaletteSortMode = 0;//Sort by palette ascending by default.
|
m_PaletteSortMode = 0;//Sort by palette ascending by default.
|
||||||
@ -128,15 +145,19 @@ Fractorium::Fractorium(QWidget* p)
|
|||||||
|
|
||||||
//Setup pointer in the GL window to point back to here.
|
//Setup pointer in the GL window to point back to here.
|
||||||
ui.GLDisplay->SetMainWindow(this);
|
ui.GLDisplay->SetMainWindow(this);
|
||||||
|
bool restored = restoreState(m_Settings->value("windowState").toByteArray());
|
||||||
showMaximized();//This won't fully set things up and show them until after this constructor exits.
|
showMaximized();//This won't fully set things up and show them until after this constructor exits.
|
||||||
|
|
||||||
connect(ui.DockWidget, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)), this, SLOT(dockLocationChanged(Qt::DockWidgetArea)));
|
connect(ui.LibraryDockWidget, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)), this, SLOT(dockLocationChanged(Qt::DockWidgetArea)));
|
||||||
connect(ui.DockWidget, SIGNAL(topLevelChanged(bool)), this, SLOT(OnDockTopLevelChanged(bool)));
|
connect(ui.LibraryDockWidget, SIGNAL(topLevelChanged(bool)), this, SLOT(OnDockTopLevelChanged(bool)));
|
||||||
|
|
||||||
//Always ensure the library tab is selected, which will show preview renders.
|
//Always ensure the library tab is selected, which will show preview renders.
|
||||||
ui.ParamsTabWidget->setCurrentIndex(0);
|
if (!restored)
|
||||||
ui.XformsTabWidget->setCurrentIndex(2);//Make variations tab the currently selected one under the Xforms tab.
|
{
|
||||||
|
ui.LibraryDockWidget->raise();
|
||||||
|
ui.LibraryDockWidget->show();
|
||||||
|
ui.XformsTabWidget->setCurrentIndex(2);//Make variations tab the currently selected one under the Xforms tab.
|
||||||
|
}
|
||||||
|
|
||||||
//Setting certain values will completely throw off the GUI, doing everything
|
//Setting certain values will completely throw off the GUI, doing everything
|
||||||
//from setting strange margins, to arbitrarily changing the fonts used.
|
//from setting strange margins, to arbitrarily changing the fonts used.
|
||||||
@ -159,6 +180,7 @@ Fractorium::Fractorium(QWidget* p)
|
|||||||
SetCoordinateStatus(0, 0, 0, 0);
|
SetCoordinateStatus(0, 0, 0, 0);
|
||||||
|
|
||||||
SetTabOrders();
|
SetTabOrders();
|
||||||
|
|
||||||
//At this point, everything has been setup except the renderer. Shortly after
|
//At this point, everything has been setup except the renderer. Shortly after
|
||||||
//this constructor exits, GLWidget::InitGL() will create the initial flock and start the rendering timer
|
//this constructor exits, GLWidget::InitGL() will create the initial flock and start the rendering timer
|
||||||
//which executes whenever the program is idle. Upon starting the timer, the renderer
|
//which executes whenever the program is idle. Upon starting the timer, the renderer
|
||||||
@ -172,6 +194,7 @@ Fractorium::Fractorium(QWidget* p)
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
Fractorium::~Fractorium()
|
Fractorium::~Fractorium()
|
||||||
{
|
{
|
||||||
|
m_Settings->setValue("windowState", saveState());
|
||||||
m_Settings->sync();
|
m_Settings->sync();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -675,9 +698,9 @@ void Fractorium::SetTabOrders()
|
|||||||
w = SetTabOrder(this, w, ui.PreMoveCombo);
|
w = SetTabOrder(this, w, ui.PreMoveCombo);
|
||||||
w = SetTabOrder(this, w, ui.PreMoveLeftButton);
|
w = SetTabOrder(this, w, ui.PreMoveLeftButton);
|
||||||
w = SetTabOrder(this, w, ui.PreMoveRightButton);
|
w = SetTabOrder(this, w, ui.PreMoveRightButton);
|
||||||
w = SetTabOrder(this, w, ui.PreScaleUpButton);
|
|
||||||
w = SetTabOrder(this, w, ui.PreScaleCombo);
|
|
||||||
w = SetTabOrder(this, w, ui.PreScaleDownButton);
|
w = SetTabOrder(this, w, ui.PreScaleDownButton);
|
||||||
|
w = SetTabOrder(this, w, ui.PreScaleCombo);
|
||||||
|
w = SetTabOrder(this, w, ui.PreScaleUpButton);
|
||||||
w = SetTabOrder(this, w, ui.ShowPreAffineCurrentRadio);
|
w = SetTabOrder(this, w, ui.ShowPreAffineCurrentRadio);
|
||||||
w = SetTabOrder(this, w, ui.ShowPreAffineAllRadio);
|
w = SetTabOrder(this, w, ui.ShowPreAffineAllRadio);
|
||||||
w = SetTabOrder(this, w, ui.PostAffineGroupBox);
|
w = SetTabOrder(this, w, ui.PostAffineGroupBox);
|
||||||
@ -700,9 +723,9 @@ void Fractorium::SetTabOrders()
|
|||||||
w = SetTabOrder(this, w, ui.PostMoveCombo);
|
w = SetTabOrder(this, w, ui.PostMoveCombo);
|
||||||
w = SetTabOrder(this, w, ui.PostMoveLeftButton);
|
w = SetTabOrder(this, w, ui.PostMoveLeftButton);
|
||||||
w = SetTabOrder(this, w, ui.PostMoveRightButton);
|
w = SetTabOrder(this, w, ui.PostMoveRightButton);
|
||||||
w = SetTabOrder(this, w, ui.PostScaleUpButton);
|
|
||||||
w = SetTabOrder(this, w, ui.PostScaleCombo);
|
|
||||||
w = SetTabOrder(this, w, ui.PostScaleDownButton);
|
w = SetTabOrder(this, w, ui.PostScaleDownButton);
|
||||||
|
w = SetTabOrder(this, w, ui.PostScaleCombo);
|
||||||
|
w = SetTabOrder(this, w, ui.PostScaleUpButton);
|
||||||
w = SetTabOrder(this, w, ui.ShowPostAffineCurrentRadio);
|
w = SetTabOrder(this, w, ui.ShowPostAffineCurrentRadio);
|
||||||
w = SetTabOrder(this, w, ui.ShowPostAffineAllRadio);
|
w = SetTabOrder(this, w, ui.ShowPostAffineAllRadio);
|
||||||
w = SetTabOrder(this, w, ui.LocalPivotRadio);
|
w = SetTabOrder(this, w, ui.LocalPivotRadio);
|
||||||
@ -718,6 +741,8 @@ void Fractorium::SetTabOrders()
|
|||||||
w = SetTabOrder(this, w, m_PaletteBlurSpin);
|
w = SetTabOrder(this, w, m_PaletteBlurSpin);
|
||||||
w = SetTabOrder(this, w, m_PaletteBrightnessSpin);
|
w = SetTabOrder(this, w, m_PaletteBrightnessSpin);
|
||||||
w = SetTabOrder(this, w, m_PaletteFrequencySpin);
|
w = SetTabOrder(this, w, m_PaletteFrequencySpin);
|
||||||
|
w = SetTabOrder(this, w, ui.PaletteFilterLineEdit);
|
||||||
|
w = SetTabOrder(this, w, ui.PaletteFilterClearButton);
|
||||||
w = SetTabOrder(this, w, ui.PaletteListTable);
|
w = SetTabOrder(this, w, ui.PaletteListTable);
|
||||||
|
|
||||||
w = SetTabOrder(this, ui.InfoBoundsGroupBox, ui.InfoBoundsFrame);//Info.
|
w = SetTabOrder(this, ui.InfoBoundsGroupBox, ui.InfoBoundsFrame);//Info.
|
||||||
|
@ -125,6 +125,8 @@ public slots:
|
|||||||
void OnActionCopySelectedXforms(bool checked);
|
void OnActionCopySelectedXforms(bool checked);
|
||||||
void OnActionPasteSelectedXforms(bool checked);
|
void OnActionPasteSelectedXforms(bool checked);
|
||||||
|
|
||||||
|
void OnActionResetWorkspace(bool checked);//View
|
||||||
|
|
||||||
void OnActionAddReflectiveSymmetry(bool checked);//Tools.
|
void OnActionAddReflectiveSymmetry(bool checked);//Tools.
|
||||||
void OnActionAddRotationalSymmetry(bool checked);
|
void OnActionAddRotationalSymmetry(bool checked);
|
||||||
void OnActionAddBothSymmetry(bool checked);
|
void OnActionAddBothSymmetry(bool checked);
|
||||||
@ -458,6 +460,7 @@ private:
|
|||||||
char m_CoordinateString[128];
|
char m_CoordinateString[128];
|
||||||
QColor m_XformComboColors[XFORM_COLOR_COUNT], m_FinalXformComboColor;
|
QColor m_XformComboColors[XFORM_COLOR_COUNT], m_FinalXformComboColor;
|
||||||
QIcon m_XformComboIcons[XFORM_COLOR_COUNT], m_FinalXformComboIcon;
|
QIcon m_XformComboIcons[XFORM_COLOR_COUNT], m_FinalXformComboIcon;
|
||||||
|
vector<QDockWidget*> m_Docks;
|
||||||
|
|
||||||
int m_FontSize;
|
int m_FontSize;
|
||||||
int m_VarSortMode;
|
int m_VarSortMode;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -29,6 +29,9 @@ void Fractorium::InitMenusUI()
|
|||||||
connect(ui.ActionPasteSelectedXforms, SIGNAL(triggered(bool)), this, SLOT(OnActionPasteSelectedXforms(bool)), Qt::QueuedConnection);
|
connect(ui.ActionPasteSelectedXforms, SIGNAL(triggered(bool)), this, SLOT(OnActionPasteSelectedXforms(bool)), Qt::QueuedConnection);
|
||||||
ui.ActionPasteSelectedXforms->setEnabled(false);
|
ui.ActionPasteSelectedXforms->setEnabled(false);
|
||||||
|
|
||||||
|
//View menu.
|
||||||
|
connect(ui.ActionResetWorkspace, SIGNAL(triggered(bool)), this, SLOT(OnActionResetWorkspace(bool)), Qt::QueuedConnection);
|
||||||
|
|
||||||
//Tools menu.
|
//Tools menu.
|
||||||
connect(ui.ActionAddReflectiveSymmetry, SIGNAL(triggered(bool)), this, SLOT(OnActionAddReflectiveSymmetry(bool)), Qt::QueuedConnection);
|
connect(ui.ActionAddReflectiveSymmetry, SIGNAL(triggered(bool)), this, SLOT(OnActionAddReflectiveSymmetry(bool)), Qt::QueuedConnection);
|
||||||
connect(ui.ActionAddRotationalSymmetry, SIGNAL(triggered(bool)), this, SLOT(OnActionAddRotationalSymmetry(bool)), Qt::QueuedConnection);
|
connect(ui.ActionAddRotationalSymmetry, SIGNAL(triggered(bool)), this, SLOT(OnActionAddRotationalSymmetry(bool)), Qt::QueuedConnection);
|
||||||
@ -663,6 +666,33 @@ void Fractorium::OnActionPasteSelectedXforms(bool checked)
|
|||||||
m_Controller->PasteSelectedXforms();
|
m_Controller->PasteSelectedXforms();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reset dock widgets and tabs to their default position.
|
||||||
|
/// Note that there is a bug in Qt, where it will only move them all to the left side if at least
|
||||||
|
/// one is on the left side, or they are all floating. If one or more are docked right, and none are docked
|
||||||
|
/// left, then it will put them all on the right side. Hopefully this isn't too much of a problem.
|
||||||
|
/// </summary>
|
||||||
|
void Fractorium::OnActionResetWorkspace(bool checked)
|
||||||
|
{
|
||||||
|
QDockWidget* firstDock = nullptr;
|
||||||
|
|
||||||
|
for (auto dock : m_Docks)
|
||||||
|
{
|
||||||
|
dock->setFloating(true);
|
||||||
|
dock->setGeometry(QRect(100, 100, dock->width(), dock->height()));//Doesn't seem to have an effect.
|
||||||
|
dock->setFloating(false);
|
||||||
|
dock->show();
|
||||||
|
|
||||||
|
if (firstDock)
|
||||||
|
tabifyDockWidget(firstDock, dock);
|
||||||
|
|
||||||
|
firstDock = dock;
|
||||||
|
}
|
||||||
|
|
||||||
|
ui.LibraryDockWidget->raise();
|
||||||
|
ui.LibraryDockWidget->show();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Add reflective symmetry to the current ember.
|
/// Add reflective symmetry to the current ember.
|
||||||
/// Resets the rendering process.
|
/// Resets the rendering process.
|
||||||
|
@ -44,7 +44,7 @@ void FractoriumSettings::EnsureDefaults()
|
|||||||
if (FinalThreadCount() == 0 || FinalThreadCount() > Timing::ProcessorCount())
|
if (FinalThreadCount() == 0 || FinalThreadCount() > Timing::ProcessorCount())
|
||||||
FinalThreadCount(Timing::ProcessorCount());
|
FinalThreadCount(Timing::ProcessorCount());
|
||||||
|
|
||||||
FinalThreadPriority(Clamp<uint>((uint)eThreadPriority::LOWEST, (uint)eThreadPriority::HIGHEST, FinalThreadPriority()));
|
FinalThreadPriority(Clamp<int>((int)eThreadPriority::LOWEST, (int)eThreadPriority::HIGHEST, FinalThreadPriority()));
|
||||||
|
|
||||||
if (CpuSubBatch() < 1)
|
if (CpuSubBatch() < 1)
|
||||||
CpuSubBatch(1);
|
CpuSubBatch(1);
|
||||||
@ -186,8 +186,8 @@ void FractoriumSettings::FinalDeviceIndex(uint i) { setValue(FINALDEVICEINDE
|
|||||||
uint FractoriumSettings::FinalThreadCount() { return value(FINALTHREADCOUNT).toUInt(); }
|
uint FractoriumSettings::FinalThreadCount() { return value(FINALTHREADCOUNT).toUInt(); }
|
||||||
void FractoriumSettings::FinalThreadCount(uint i) { setValue(FINALTHREADCOUNT, i); }
|
void FractoriumSettings::FinalThreadCount(uint i) { setValue(FINALTHREADCOUNT, i); }
|
||||||
|
|
||||||
uint FractoriumSettings::FinalThreadPriority() { return value(FINALTHREADPRIORITY).toUInt(); }
|
uint FractoriumSettings::FinalThreadPriority() { return value(FINALTHREADPRIORITY).toInt(); }
|
||||||
void FractoriumSettings::FinalThreadPriority(uint i) { setValue(FINALTHREADPRIORITY, i); }
|
void FractoriumSettings::FinalThreadPriority(int i) { setValue(FINALTHREADPRIORITY, i); }
|
||||||
|
|
||||||
uint FractoriumSettings::FinalQuality() { return value(FINALQUALITY).toUInt(); }
|
uint FractoriumSettings::FinalQuality() { return value(FINALQUALITY).toUInt(); }
|
||||||
void FractoriumSettings::FinalQuality(uint i) { setValue(FINALQUALITY, i); }
|
void FractoriumSettings::FinalQuality(uint i) { setValue(FINALQUALITY, i); }
|
||||||
|
@ -153,7 +153,7 @@ public:
|
|||||||
void FinalThreadCount(uint b);
|
void FinalThreadCount(uint b);
|
||||||
|
|
||||||
uint FinalThreadPriority();
|
uint FinalThreadPriority();
|
||||||
void FinalThreadPriority(uint b);
|
void FinalThreadPriority(int b);
|
||||||
|
|
||||||
uint FinalQuality();
|
uint FinalQuality();
|
||||||
void FinalQuality(uint i);
|
void FinalQuality(uint i);
|
||||||
|
@ -150,8 +150,8 @@ void Fractorium::InitXformsAffineUI()
|
|||||||
|
|
||||||
//Further, the size of the dock widget won't be properly adjusted until the xforms tab is shown.
|
//Further, the size of the dock widget won't be properly adjusted until the xforms tab is shown.
|
||||||
//So show it here and it will be switched back in Fractorium's constructor.
|
//So show it here and it will be switched back in Fractorium's constructor.
|
||||||
ui.ParamsTabWidget->setCurrentIndex(2);
|
//ui.ParamsTabWidget->setCurrentIndex(2);
|
||||||
ui.DockWidget->update();
|
//ui.DockWidget->update();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Placing pointers to the spin boxes in arrays makes them easier to access in various places.
|
//Placing pointers to the spin boxes in arrays makes them easier to access in various places.
|
||||||
|
Loading…
Reference in New Issue
Block a user