diff --git a/Source/Ember/Ember.h b/Source/Ember/Ember.h index 95b211e..b361cbc 100644 --- a/Source/Ember/Ember.h +++ b/Source/Ember/Ember.h @@ -981,7 +981,8 @@ public: { for (size_t i = 0; i < XformCount(); i++) { - m_Xforms[i].SetXaos(i, 0);//First make each xform xaos array be maxXformCount elements long and set them to zero. + for (size_t k = 0; k < XformCount(); k++)//First make each xform xaos array be maxXformCount elements long and set them to zero. + m_Xforms[i].SetXaos(k, 0); //Now fill them with interpolated values. for (size_t j = 0; j < size; j++)//For each ember in the list. diff --git a/Source/Ember/Interpolate.h b/Source/Ember/Interpolate.h index d06b541..7703f4c 100644 --- a/Source/Ember/Interpolate.h +++ b/Source/Ember/Interpolate.h @@ -395,7 +395,6 @@ public: vector c(2); Ember localEmbers[4]; bool smoothFlag = false; - c.resize(2); if (embers[0].m_Time >= time) { diff --git a/Source/EmberAnimate/EmberAnimate.cpp b/Source/EmberAnimate/EmberAnimate.cpp index 2030c06..83d49a1 100644 --- a/Source/EmberAnimate/EmberAnimate.cpp +++ b/Source/EmberAnimate/EmberAnimate.cpp @@ -32,7 +32,7 @@ bool EmberAnimate(EmberOptions& opt) bool finishXml = false; bool appendXml = false; uint finalImageIndex = 0; - uint i, channels, ftime; + uint i, channels, ftime, padding; string s, flameName, filename, inputPath = GetPath(opt.Input()); ostringstream os; vector> embers; @@ -248,6 +248,7 @@ bool EmberAnimate(EmberOptions& opt) //Final setup steps before running. os.imbue(std::locale("")); + padding = uint(log10((double)embers.size())) + 1; renderer->SetEmber(embers); renderer->EarlyClip(opt.EarlyClip()); renderer->YAxisUp(opt.YAxisUp()); @@ -300,7 +301,8 @@ bool EmberAnimate(EmberOptions& opt) if (opt.Out().empty()) { ostringstream fnstream; - fnstream << inputPath << opt.Prefix() << setfill('0') << setw(opt.FilenamePadding()) << ftime << opt.Suffix() << "." << opt.Format(); + + fnstream << inputPath << opt.Prefix() << setfill('0') << setw(padding) << ftime << opt.Suffix() << "." << opt.Format(); filename = fnstream.str(); } diff --git a/Source/EmberCL/DEOpenCLKernelCreator.cpp b/Source/EmberCL/DEOpenCLKernelCreator.cpp index 4bc0e61..8a675de 100644 --- a/Source/EmberCL/DEOpenCLKernelCreator.cpp +++ b/Source/EmberCL/DEOpenCLKernelCreator.cpp @@ -291,7 +291,7 @@ string DEOpenCLKernelCreator::CreateGaussianDEKernel(size_t ss) if (doScf) os << - " real_t scfact = pow(densityFilter->m_Supersample / (densityFilter->m_Supersample + 1.0), 2.0);\n"; + " real_t scfact = pow(densityFilter->m_Supersample / (densityFilter->m_Supersample + 1.0), (real_t)2.0);\n"; } os << @@ -518,7 +518,7 @@ string DEOpenCLKernelCreator::CreateGaussianDEKernel(size_t ss) if (doScf) os << - " real_t scfact = pow(densityFilter->m_Supersample / (densityFilter->m_Supersample + 1.0), 2.0);\n"; + " real_t scfact = pow(densityFilter->m_Supersample / (densityFilter->m_Supersample + 1.0), (real_t)2.0);\n"; } //Compute the size of the temporary box which is the block width + 2 * filter width x block height + 2 * filter width. @@ -646,12 +646,13 @@ string DEOpenCLKernelCreator::CreateGaussianDEKernel(size_t ss) "\n"; if (doScf) - os << " filterSelect *= scfact;\n"; + os << + " filterSelect *= scfact;\n"; } else { - os - << " filterSelect = bucket.w;\n"; + os << + " filterSelect = bucket.w;\n"; } os << @@ -775,7 +776,7 @@ string DEOpenCLKernelCreator::CreateGaussianDEKernelNoLocalCache(size_t ss) " int densityBoxBottomY;\n"; if (doScf) - os << " real_t scfact = pow((real_t)densityFilter->m_Supersample / ((real_t)densityFilter->m_Supersample + 1.0), 2.0);\n"; + os << " real_t scfact = pow((real_t)densityFilter->m_Supersample / ((real_t)densityFilter->m_Supersample + 1.0), (real_t)2.0);\n"; } os << diff --git a/Source/EmberCommon/EmberOptions.h b/Source/EmberCommon/EmberOptions.h index fe7ca86..a63c742 100644 --- a/Source/EmberCommon/EmberOptions.h +++ b/Source/EmberCommon/EmberOptions.h @@ -73,7 +73,6 @@ enum eOptionIDs OPT_TIME, OPT_DTIME, OPT_NFRAMES, - OPT_FNPADDING, OPT_SYMMETRY, OPT_SHEEP_GEN, OPT_SHEEP_ID, @@ -350,7 +349,6 @@ public: INITUINTOPTION(Frame, Eou(OPT_ANIM_GENOME, OPT_FRAME, _T("--frame"), 0, SO_REQ_SEP, "\t--frame= Synonym for \"time\".\n")); INITUINTOPTION(Dtime, Eou(OPT_USE_ANIMATE, OPT_DTIME, _T("--dtime"), 1, SO_REQ_SEP, "\t--dtime= Time between frames [default: 1].\n")); INITUINTOPTION(Frames, Eou(OPT_USE_GENOME, OPT_NFRAMES, _T("--nframes"), 20, SO_REQ_SEP, "\t--nframes= Number of frames for each stage of the animation [default: 20].\n")); - INITUINTOPTION(FilenamePadding,Eou(OPT_USE_ANIMATE, OPT_FNPADDING, _T("--filename_padding"), 5, SO_REQ_SEP, "\t--filename_padding= Number of zeros to pad frame numbers with in output filename [default: 5].\n")); INITUINTOPTION(Loops, Eou(OPT_USE_GENOME, OPT_LOOPS, _T("--loops"), 1, SO_REQ_SEP, "\t--loops= Number of times to rotate each control point in sequence [default: 1].\n")); INITUINTOPTION(Repeat, Eou(OPT_USE_GENOME, OPT_REPEAT, _T("--repeat"), 1, SO_REQ_SEP, "\t--repeat= 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= Number times to try creating a flame that meets the specified constraints. Ignored if sequence, inter or rotate were specified [default: 10].\n")); @@ -480,7 +478,6 @@ public: PARSEUINTOPTION(OPT_TIME, Time); PARSEUINTOPTION(OPT_DTIME, Dtime); PARSEUINTOPTION(OPT_NFRAMES, Frames); - PARSEUINTOPTION(OPT_FNPADDING, FilenamePadding); PARSEUINTOPTION(OPT_LOOPS, Loops); PARSEUINTOPTION(OPT_REPEAT, Repeat); PARSEUINTOPTION(OPT_TRIES, Tries); @@ -696,7 +693,6 @@ public: EmberOptionEntry Time; EmberOptionEntry Dtime; EmberOptionEntry Frames; - EmberOptionEntry FilenamePadding; EmberOptionEntry Loops; EmberOptionEntry Repeat; EmberOptionEntry Tries; diff --git a/Source/EmberRender/EmberRender.cpp b/Source/EmberRender/EmberRender.cpp index 8053c26..9e90fb9 100644 --- a/Source/EmberRender/EmberRender.cpp +++ b/Source/EmberRender/EmberRender.cpp @@ -28,6 +28,7 @@ bool EmberRender(EmberOptions& opt) Timing t; bool writeSuccess = false; byte* finalImagep; + uint padding; size_t i, channels; size_t strips; size_t iterCount; @@ -144,6 +145,7 @@ bool EmberRender(EmberOptions& opt) //Final setup steps before running. os.imbue(std::locale("")); + padding = uint(log10((double)embers.size())) + 1; renderer->EarlyClip(opt.EarlyClip()); renderer->YAxisUp(opt.YAxisUp()); renderer->LockAccum(opt.LockAccum()); @@ -259,10 +261,10 @@ bool EmberRender(EmberOptions& opt) } else { - ostringstream ssLocal; + ostringstream fnstream; - ssLocal << inputPath << opt.Prefix() << setfill('0') << setw(5) << i << opt.Suffix() << "." << opt.Format(); - filename = ssLocal.str(); + fnstream << inputPath << opt.Prefix() << setfill('0') << setw(padding) << i << opt.Suffix() << "." << opt.Format(); + filename = fnstream.str(); } //TotalIterCount() is actually using ScaledQuality() which does not get reset upon ember assignment, diff --git a/Source/EmberTester/EmberTester.cpp b/Source/EmberTester/EmberTester.cpp index 8d77a51..a66ca13 100644 --- a/Source/EmberTester/EmberTester.cpp +++ b/Source/EmberTester/EmberTester.cpp @@ -1883,6 +1883,15 @@ int _tmain(int argc, _TCHAR* argv[]) //int i; Timing t(4); QTIsaac rand; + double d = 1; + + for (int i = 0; i < 10; i++) + { + cout << "log10(" << d << ") = " << std::max(1u, uint(log10(d)) + 1u) << endl; + d *= 10; + } + + return 0; //glm::vec2 solution, src[4]; //double bezT = 1, w[4]; //BezierPoints curvePoints[4]; @@ -1957,11 +1966,11 @@ int _tmain(int argc, _TCHAR* argv[]) //cd2 = sin(cd); - t.Tic(); + /*t.Tic(); TestCasting(); t.Toc("TestCasting()"); - /*t.Tic(); + t.Tic(); VariationList vlf; t.Toc("Creating VariationList");