diff --git a/Builds/MSVC/VS2010/FractoriumInstaller/FractoriumInstaller.wixproj b/Builds/MSVC/VS2010/FractoriumInstaller/FractoriumInstaller.wixproj index 3f2416b..a20adbe 100644 --- a/Builds/MSVC/VS2010/FractoriumInstaller/FractoriumInstaller.wixproj +++ b/Builds/MSVC/VS2010/FractoriumInstaller/FractoriumInstaller.wixproj @@ -6,7 +6,7 @@ 3.7 {c8096c47-e358-438c-a520-146d46b0637d} 2.0 - Fractorium_Beta_0.4.1.0 + Fractorium_Beta_0.4.1.1 Package $(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets $(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets diff --git a/Builds/MSVC/VS2010/FractoriumInstaller/Product.wxs b/Builds/MSVC/VS2010/FractoriumInstaller/Product.wxs index 9c1a3e7..1b211f4 100644 --- a/Builds/MSVC/VS2010/FractoriumInstaller/Product.wxs +++ b/Builds/MSVC/VS2010/FractoriumInstaller/Product.wxs @@ -1,6 +1,6 @@ - + @@ -13,7 +13,7 @@ - + xform = *ember.GetXform(i);//Will call assignment operator to convert between types T and U. + if (Xform* p = ember.GetXform(i)) + { + Xform xform = *p;//Will call assignment operator to convert between types T and U. - AddXform(xform); + AddXform(xform); + } } Xform finalXform = *ember.FinalXform();//Will call assignment operator to convert between types T and U. diff --git a/Source/Ember/EmberDefines.h b/Source/Ember/EmberDefines.h index e6b5be5..403237b 100644 --- a/Source/Ember/EmberDefines.h +++ b/Source/Ember/EmberDefines.h @@ -25,7 +25,7 @@ namespace EmberNs extern void sincos(double x, double *s, double *c); #endif -#define EMBER_VERSION "0.4.1.0" +#define EMBER_VERSION "0.4.1.1" #define EPS6 T(1e-6) #define EPS std::numeric_limits::epsilon()//Apoplugin.h uses -20, but it's more mathematically correct to do it this way. #define ISAAC_SIZE 4 diff --git a/Source/Ember/Renderer.cpp b/Source/Ember/Renderer.cpp index dc962b8..5311569 100644 --- a/Source/Ember/Renderer.cpp +++ b/Source/Ember/Renderer.cpp @@ -263,12 +263,12 @@ bool Renderer::CreateTemporalFilter(bool& newAlloc) newAlloc = false; //Use intelligent testing so it isn't created every time a new ember is passed in. - if ((m_TemporalFilter.get() == NULL) || - (m_Ember.m_Passes != m_LastEmber.m_Passes) || - (m_Ember.m_TemporalSamples != m_LastEmber.m_TemporalSamples) || + if ((!m_TemporalFilter.get()) || + (m_Ember.m_Passes != m_TemporalFilter->Passes()) || + (m_Ember.m_TemporalSamples != m_TemporalFilter->TemporalSamples()) || (m_Ember.m_TemporalFilterType != m_TemporalFilter->FilterType()) || - (m_Ember.m_TemporalFilterWidth != m_LastEmber.m_TemporalFilterWidth) || - (m_Ember.m_TemporalFilterExp != m_LastEmber.m_TemporalFilterExp)) + (m_Ember.m_TemporalFilterWidth != m_TemporalFilter->FilterWidth()) || + (m_Ember.m_TemporalFilterExp != m_TemporalFilter->FilterExp())) { m_TemporalFilter = auto_ptr>( TemporalFilterCreator::Create(m_Ember.m_TemporalFilterType, m_Ember.m_Passes, m_Ember.m_TemporalSamples, m_Ember.m_TemporalFilterWidth, m_Ember.m_TemporalFilterExp)); @@ -296,10 +296,10 @@ bool Renderer::PrepFinalAccumVector(vector& pixels) if (m_ReclaimOnResize) { if (pixels.size() != size) + { pixels.resize(size); - - if (m_ReclaimOnResize) pixels.shrink_to_fit(); + } } else { @@ -850,11 +850,11 @@ bool Renderer::CreateDEFilter(bool& newAlloc) if (m_Ember.m_MaxRadDE > 0) { //Use intelligent testing so it isn't created every time a new ember is passed in. - if ((m_DensityFilter.get() == NULL) || + if ((!m_DensityFilter.get()) || (m_Ember.m_MinRadDE != m_DensityFilter->MinRad()) || (m_Ember.m_MaxRadDE != m_DensityFilter->MaxRad()) || (m_Ember.m_CurveDE != m_DensityFilter->Curve()) || - (m_Ember.m_Supersample != m_LastEmber.m_Supersample)) + (m_Ember.m_Supersample != m_DensityFilter->Supersample())) { m_DensityFilter = auto_ptr>(new DensityFilter(m_Ember.m_MinRadDE, m_Ember.m_MaxRadDE, m_Ember.m_CurveDE, m_Ember.m_Supersample)); newAlloc = true; @@ -889,10 +889,10 @@ bool Renderer::CreateSpatialFilter(bool& newAlloc) newAlloc = false; //Use intelligent testing so it isn't created every time a new ember is passed in. - if ((m_SpatialFilter.get() == NULL) || + if ((!m_SpatialFilter.get()) || (m_Ember.m_SpatialFilterType != m_SpatialFilter->FilterType()) || (m_Ember.m_SpatialFilterRadius != m_SpatialFilter->FilterRadius()) || - (m_Ember.m_Supersample != m_LastEmber.m_Supersample) || + (m_Ember.m_Supersample != m_SpatialFilter->Supersample()) || (m_PixelAspectRatio != m_SpatialFilter->PixelAspectRatio())) { m_SpatialFilter = auto_ptr>( @@ -1007,7 +1007,7 @@ void Renderer::ThreadCount(unsigned int threads, const char* seedStr #ifdef ISAAC_FLAM3_DEBUG QTIsaac isaac(0, 0, 0, seeds); #else - QTIsaac isaac(newSize, newSize * newSize, newSize * newSize * newSize, seeds); + QTIsaac isaac(newSize, newSize * 2, newSize * 3, seeds); #endif m_Rand.push_back(isaac); diff --git a/Source/Ember/TemporalFilter.h b/Source/Ember/TemporalFilter.h index e4d8e93..6785ebb 100644 --- a/Source/Ember/TemporalFilter.h +++ b/Source/Ember/TemporalFilter.h @@ -40,9 +40,13 @@ public: { unsigned int i, steps = passes * temporalSamples; + m_Passes = passes; + m_TemporalSamples = temporalSamples; + m_FilterWidth = filterWidth; m_Deltas.resize(steps); m_Filter.resize(steps); m_FilterType = filterType; + m_FilterExp = 1; if (steps == 1) { @@ -83,6 +87,10 @@ public: { if (this != &filter) { + m_Passes = filter.m_Passes; + m_TemporalSamples = filter.m_TemporalSamples; + m_FilterWidth = filter.m_FilterWidth; + m_FilterExp = filter.m_FilterExp; m_SumFilt = filter.m_SumFilt; m_Deltas = filter.m_Deltas; m_Filter = filter.m_Filter; @@ -127,6 +135,10 @@ public: /// Accessors. /// size_t Size() const { return m_Filter.size(); } + unsigned int Passes() const { return m_Passes; } + unsigned int TemporalSamples() const { return m_TemporalSamples; } + T FilterWidth() const { return m_FilterWidth; } + T FilterExp() const { return m_FilterExp; } T SumFilt() const { return m_SumFilt; } T* Deltas() { return &m_Deltas[0]; } T* Filter() { return &m_Filter[0]; } @@ -151,6 +163,10 @@ protected: } T m_SumFilt;//The sum of all filter values. + T m_FilterWidth; + T m_FilterExp; + unsigned int m_Passes; + unsigned int m_TemporalSamples; vector m_Deltas;//Delta vector. vector m_Filter;//Filter vector. eTemporalFilterType m_FilterType;//The type of filter this is. @@ -192,6 +208,7 @@ public: maxFilt = m_Filter[i]; } + m_FilterExp = filterExp; FinishFilter(maxFilt); } } diff --git a/Source/Ember/Variations03.h b/Source/Ember/Variations03.h index 0a68b6e..4e4ebe4 100644 --- a/Source/Ember/Variations03.h +++ b/Source/Ember/Variations03.h @@ -20,7 +20,7 @@ public: void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) { - T temp = 1 / cos(helper.In.y) + m_Effect * T(M_PI); + T temp = 1 / Zeps(cos(helper.In.y)) + m_Effect * T(M_PI); helper.Out.x = m_Weight * (tanh(helper.In.x) * temp); helper.Out.y = m_Weight * (tanh(helper.In.y) * temp); @@ -36,7 +36,7 @@ public: string effect = "parVars[" + ToUpper(m_Params[i++].Name()) + index; ss << "\t{\n" - << "\t\treal_t temp = 1 / cos(vIn.y) + " << effect << " * M_PI;\n" + << "\t\treal_t temp = 1 / Zeps(cos(vIn.y)) + " << effect << " * M_PI;\n" << "\n" << "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * (tanh(vIn.x) * temp);\n" << "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * (tanh(vIn.y) * temp);\n" @@ -276,11 +276,9 @@ public: void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) { - T r = pow(helper.m_PrecalcSqrtSumSquares, m_Dist); + T r = Zeps(pow(helper.m_PrecalcSqrtSumSquares, m_Dist)); int n = Floor(m_Power * rand.Frand01()); - T alpha = helper.m_PrecalcAtanyx + n * M_2PI / Floor(m_Power); - //int n = (int)floor(m_Power * rand.Frand01()); - //T alpha = helper.m_PrecalcAtanyx + n * M_2PI / floor(m_Power); + T alpha = helper.m_PrecalcAtanyx + n * M_2PI / Zeps((T)Floor(m_Power)); T sina = sin(alpha); T cosa = cos(alpha); @@ -299,9 +297,9 @@ public: string dist = "parVars[" + ToUpper(m_Params[i++].Name()) + index; ss << "\t{\n" - << "\t\treal_t r = pow(precalcSqrtSumSquares, " << dist << ");\n" + << "\t\treal_t r = Zeps(pow(precalcSqrtSumSquares, " << dist << "));\n" << "\t\tint n = floor(" << power << " * MwcNext01(mwc));\n" - << "\t\treal_t alpha = precalcAtanyx + n * M_2PI / floor(" << power << ");\n" + << "\t\treal_t alpha = precalcAtanyx + n * M_2PI / Zeps(floor(" << power << "));\n" << "\t\treal_t sina = sin(alpha);\n" << "\t\treal_t cosa = cos(alpha);\n" << "\n" diff --git a/Source/Ember/VariationsDC.h b/Source/Ember/VariationsDC.h index 9a2f943..f370638 100644 --- a/Source/Ember/VariationsDC.h +++ b/Source/Ember/VariationsDC.h @@ -23,7 +23,7 @@ public: void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) { T r = helper.m_PrecalcSumSquares; - T r4_1 = r / 4 + 1; + T r4_1 = Zeps(r / 4 + 1); r4_1 = m_Weight / r4_1; helper.Out.x = r4_1 * helper.In.x; @@ -49,7 +49,7 @@ public: ss << "\t{\n" << "\t\treal_t r = precalcSumSquares;\n" - << "\t\treal_t r4_1 = r / 4 + 1;\n" + << "\t\treal_t r4_1 = Zeps(r / 4 + 1);\n" << "\t\tr4_1 = xform->m_VariationWeights[" << varIndex << "] / r4_1;\n" << "\n" << "\t\tvOut.x = r4_1 * vIn.x;\n" diff --git a/Source/Ember/Xform.h b/Source/Ember/Xform.h index aabe4dd..f027bb9 100644 --- a/Source/Ember/Xform.h +++ b/Source/Ember/Xform.h @@ -171,9 +171,12 @@ public: for (unsigned int i = 0; i < xform.TotalVariationCount(); i++) { Variation* var = NULL; - - xform.GetVariation(i)->Copy(var);//Will convert from type U to type T. - AddVariation(var);//Will internally call SetPrecalcFlags(). + + if (Variation* varOrig = xform.GetVariation(i)) + { + varOrig->Copy(var);//Will convert from type U to type T. + AddVariation(var);//Will internally call SetPrecalcFlags(). + } } if (TotalVariationCount() == 0) diff --git a/Source/EmberAnimate/EmberAnimate.rc b/Source/EmberAnimate/EmberAnimate.rc index e25027b..6bd8ff9 100644 --- a/Source/EmberAnimate/EmberAnimate.rc +++ b/Source/EmberAnimate/EmberAnimate.rc @@ -49,8 +49,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,4,1,0 - PRODUCTVERSION 0,4,1,0 + FILEVERSION 0,4,1,1 + PRODUCTVERSION 0,4,1,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -67,12 +67,12 @@ BEGIN BEGIN VALUE "CompanyName", "Open Source" VALUE "FileDescription", "Renders fractal flames as animations with motion blur" - VALUE "FileVersion", "0.4.1.0" + VALUE "FileVersion", "0.4.1.1" VALUE "InternalName", "EmberAnimate.rc" VALUE "LegalCopyright", "Copyright (C) Matt Feemster 2013, GPL v3" VALUE "OriginalFilename", "EmberAnimate.rc" VALUE "ProductName", "Ember Animate" - VALUE "ProductVersion", "0.4.1.0" + VALUE "ProductVersion", "0.4.1.1" END END BLOCK "VarFileInfo" diff --git a/Source/EmberCL/RendererCL.cpp b/Source/EmberCL/RendererCL.cpp index 800ee13..28fc380 100644 --- a/Source/EmberCL/RendererCL.cpp +++ b/Source/EmberCL/RendererCL.cpp @@ -49,7 +49,7 @@ RendererCL::RendererCL(unsigned int platform, unsigned int device, bool share m_PaletteFormat.image_channel_order = CL_RGBA; m_PaletteFormat.image_channel_data_type = CL_FLOAT; m_FinalFormat.image_channel_order = CL_RGBA; - m_FinalFormat.image_channel_data_type = CL_UNORM_INT8;//Change if this ever supports 2BPP outputs for PNG. + m_FinalFormat.image_channel_data_type = CL_UNORM_INT8;//Change if this ever supports 2BPC outputs for PNG. Init(platform, device, shared, outputTexID);//Init OpenCL upon construction and create programs that will not change. } diff --git a/Source/EmberGenome/EmberGenome.rc b/Source/EmberGenome/EmberGenome.rc index 3824869..12be5b4 100644 --- a/Source/EmberGenome/EmberGenome.rc +++ b/Source/EmberGenome/EmberGenome.rc @@ -49,8 +49,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,4,1,0 - PRODUCTVERSION 0,4,1,0 + FILEVERSION 0,4,1,1 + PRODUCTVERSION 0,4,1,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -67,12 +67,12 @@ BEGIN BEGIN VALUE "CompanyName", "Open Source" VALUE "FileDescription", "Manipulates fractal flames parameter files" - VALUE "FileVersion", "0.4.1.0" + VALUE "FileVersion", "0.4.1.1" VALUE "InternalName", "EmberGenome.rc" VALUE "LegalCopyright", "Copyright (C) Matt Feemster 2013, GPL v3" VALUE "OriginalFilename", "EmberGenome.rc" VALUE "ProductName", "Ember Genome" - VALUE "ProductVersion", "0.4.1.0" + VALUE "ProductVersion", "0.4.1.1" END END BLOCK "VarFileInfo" diff --git a/Source/EmberRender/EmberRender.rc b/Source/EmberRender/EmberRender.rc index df68541..0ee29ce 100644 --- a/Source/EmberRender/EmberRender.rc +++ b/Source/EmberRender/EmberRender.rc @@ -49,8 +49,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,4,1,0 - PRODUCTVERSION 0,4,1,0 + FILEVERSION 0,4,1,1 + PRODUCTVERSION 0,4,1,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -67,12 +67,12 @@ BEGIN BEGIN VALUE "CompanyName", "Open Source" VALUE "FileDescription", "Renders fractal flames as single images" - VALUE "FileVersion", "0.4.1.0" + VALUE "FileVersion", "0.4.1.1" VALUE "InternalName", "EmberRender.rc" VALUE "LegalCopyright", "Copyright (C) Matt Feemster 2013, GPL v3" VALUE "OriginalFilename", "EmberRender.rc" VALUE "ProductName", "Ember Render" - VALUE "ProductVersion", "0.4.1.0" + VALUE "ProductVersion", "0.4.1.1" END END BLOCK "VarFileInfo" diff --git a/Source/EmberTester/EmberTester.cpp b/Source/EmberTester/EmberTester.cpp index 0fc0e1d..e49b626 100644 --- a/Source/EmberTester/EmberTester.cpp +++ b/Source/EmberTester/EmberTester.cpp @@ -1074,6 +1074,28 @@ bool TestVarAssignVals() return success; } +bool TestZepsFloor() +{ + bool success = true; + VariationList vlf; + vector zeps; + + zeps.push_back("Zeps(floor"); + + for (size_t i = 0; i < vlf.Size(); i++) + { + Variation* var = vlf.GetVariation(i); + + if (SearchVar(var, zeps, false)) + { + cout << "Variation " << var->Name() << " contains Zeps(floor()). This is fine for the GPU, but ensure the CPU uses Zeps((T)Floor())." << endl; + success = false; + } + } + + return success; +} + bool TestConstants() { bool success = true; @@ -1864,6 +1886,10 @@ int _tmain(int argc, _TCHAR* argv[]) TestVarAssignVals(); t.Toc("TestVarAssignVals()"); + t.Tic(); + TestZepsFloor(); + t.Toc("TestZepsFloor()"); + t.Tic(); TestConstants(); t.Toc("TestConstants()"); diff --git a/Source/Fractorium/AboutDialog.ui b/Source/Fractorium/AboutDialog.ui index 83a5853..5382776 100644 --- a/Source/Fractorium/AboutDialog.ui +++ b/Source/Fractorium/AboutDialog.ui @@ -52,7 +52,7 @@ - <html><head/><body><p align="center"><br/><span style=" font-size:12pt;">Fractorium 0.4.1.0 Beta</span></p><p align="center"><span style=" font-size:10pt;"><br/>A Qt-based fractal flame editor which uses a C++ re-write of the flam3 algorithm named Ember and a GPU capable version named EmberCL which implements a portion of the cuburn algorithm in OpenCL.</span></p><p align="center"><span style=" font-size:10pt;">Matt Feemster</span></p></body></html> + <html><head/><body><p align="center"><br/><span style=" font-size:12pt;">Fractorium 0.4.1.1 Beta</span></p><p align="center"><span style=" font-size:10pt;"><br/>A Qt-based fractal flame editor which uses a C++ re-write of the flam3 algorithm named Ember and a GPU capable version named EmberCL which implements a portion of the cuburn algorithm in OpenCL.</span></p><p align="center"><span style=" font-size:10pt;">Matt Feemster</span></p></body></html> Qt::RichText diff --git a/Source/Fractorium/FinalRenderEmberController.cpp b/Source/Fractorium/FinalRenderEmberController.cpp index f65ba26..a2b147e 100644 --- a/Source/Fractorium/FinalRenderEmberController.cpp +++ b/Source/Fractorium/FinalRenderEmberController.cpp @@ -83,16 +83,16 @@ template FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderDialog* finalRender) : FinalRenderEmberControllerBase(finalRender) { - m_PreviewRenderer = auto_ptr>(new EmberNs::Renderer()); - m_PreviewRenderer->Callback(NULL); - m_PreviewRenderer->NumChannels(4); - m_PreviewRenderer->ReclaimOnResize(true); + m_FinalPreviewRenderer = auto_ptr>(new EmberNs::Renderer()); + m_FinalPreviewRenderer->Callback(NULL); + m_FinalPreviewRenderer->NumChannels(4); + m_FinalPreviewRenderer->ReclaimOnResize(true); - m_PreviewRenderFunc = [&]() + m_FinalPreviewRenderFunc = [&]() { m_PreviewCs.Enter();//Thread prep. m_PreviewRun = true; - m_PreviewRenderer->Abort(); + m_FinalPreviewRenderer->Abort(); QLabel* widget = m_FinalRender->ui.FinalRenderPreviewLabel; unsigned int maxDim = 100u; @@ -106,21 +106,20 @@ FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderD m_PreviewEmber = m_Ember; m_PreviewEmber.m_Quality = 100; - m_PreviewEmber.m_Supersample = 1; m_PreviewEmber.m_TemporalSamples = 1; m_PreviewEmber.m_FinalRasW = min(maxDim, unsigned int(scalePercentage * m_Ember.m_FinalRasW)); m_PreviewEmber.m_FinalRasH = min(maxDim, unsigned int(scalePercentage * m_Ember.m_FinalRasH)); m_PreviewEmber.m_PixelsPerUnit = scalePercentage * m_Ember.m_PixelsPerUnit; - while (!m_PreviewRenderer->Aborted() || m_PreviewRenderer->InRender()) + while (!m_FinalPreviewRenderer->Aborted() || m_FinalPreviewRenderer->InRender()) QApplication::processEvents(); - m_PreviewRenderer->EarlyClip(m_FinalRender->EarlyClip()); - m_PreviewRenderer->YAxisUp(m_FinalRender->YAxisUp()); - m_PreviewRenderer->Transparency(m_FinalRender->Transparency()); - m_PreviewRenderer->SetEmber(m_PreviewEmber); + m_FinalPreviewRenderer->EarlyClip(m_FinalRender->EarlyClip()); + m_FinalPreviewRenderer->YAxisUp(m_FinalRender->YAxisUp()); + m_FinalPreviewRenderer->Transparency(m_FinalRender->Transparency()); + m_FinalPreviewRenderer->SetEmber(m_PreviewEmber); - if (m_PreviewRenderer->Run(m_PreviewFinalImage) == RENDER_OK) + if (m_FinalPreviewRenderer->Run(m_PreviewFinalImage) == RENDER_OK) { QImage image(m_PreviewEmber.m_FinalRasW, m_PreviewEmber.m_FinalRasH, QImage::Format_RGBA8888);//The label wants RGBA. memcpy(image.scanLine(0), m_PreviewFinalImage.data(), m_PreviewFinalImage.size() * sizeof(m_PreviewFinalImage[0]));//Memcpy the data in. @@ -135,7 +134,7 @@ FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderD //The main rendering function which will be called in a Qt thread. //A backup Xml is made before the rendering process starts just in case it crashes before finishing. //If it finishes successfully, delete the backup file. - m_RenderFunc = [&]() + m_FinalRenderFunc = [&]() { size_t i; @@ -243,6 +242,7 @@ FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderD m_Ember.m_TemporalSamples = 1; m_Renderer->SetEmber(m_Ember); m_PureIterTime = 0; + memset(m_FinalImage.data(), 0, m_FinalImage.size() * sizeof(m_FinalImage[0])); m_RenderTimer.Tic();//Toc() is called in the progress function. if (m_Renderer->Run(m_FinalImage) != RENDER_OK) @@ -266,6 +266,7 @@ template void FinalRenderEmberController::SetEmber(const Ember void FinalRenderEmberController::CopyEmber(Ember& ember) { ember = m_Ember; } template void FinalRenderEmberController::SetEmberFile(const EmberFile& emberFile) { m_EmberFile = emberFile; } template void FinalRenderEmberController::CopyEmberFile(EmberFile& emberFile) { emberFile = m_EmberFile; } +template void FinalRenderEmberController::SetOriginalEmber(Ember& ember) { m_OriginalEmber = ember; } template double FinalRenderEmberController::OriginalAspect() { return double(m_OriginalEmber.m_OrigFinalRasW) / m_OriginalEmber.m_OrigFinalRasH; } #ifdef DO_DOUBLE template void FinalRenderEmberController::SetEmber(const Ember& ember, bool verbatim) { m_Ember = ember; } @@ -273,8 +274,6 @@ template void FinalRenderEmberController::CopyEmber(Ember void FinalRenderEmberController::SetEmberFile(const EmberFile& emberFile) { m_EmberFile = emberFile; } template void FinalRenderEmberController::CopyEmberFile(EmberFile& emberFile) { emberFile = m_EmberFile; } template void FinalRenderEmberController::SetOriginalEmber(Ember& ember) { m_OriginalEmber = ember; } -#else -template void FinalRenderEmberController::SetOriginalEmber(Ember& ember) { m_OriginalEmber = ember; } #endif /// @@ -313,7 +312,7 @@ int FinalRenderEmberController::ProgressFunc(Ember& ember, void* foo, doub QFileInfo original(filename); EmberStats stats = m_Renderer->Stats(); QString iters = QLocale(QLocale::English).toString(stats.m_Iters); - QString itersPerSec = QLocale(QLocale::English).toString(int(stats.m_Iters / (m_PureIterTime / 1000.0))); + QString itersPerSec = QLocale(QLocale::English).toString(unsigned __int64(stats.m_Iters / (m_PureIterTime / 1000.0))); if (m_GuiState.m_DoAll && m_EmberFile.m_Embers.size() > 1) filename = original.absolutePath() + QDir::separator() + m_GuiState.m_Prefix + QString::fromStdString(m_EmberFile.m_Embers[m_FinishedImageCount].m_Name) + m_GuiState.m_Suffix + "." + m_GuiState.m_DoAllExt; @@ -409,7 +408,7 @@ bool FinalRenderEmberController::Render() //parallel iteration loops inside of the CPU renderer to finish. The result is that //the renderer ends up using ThreadCount - 1 to iterate, instead of ThreadCount. //By using a Qt thread here, and tbb inside the renderer, all cores can be maxed out. - m_Result = QtConcurrent::run(m_RenderFunc); + m_Result = QtConcurrent::run(m_FinalRenderFunc); m_Settings->sync(); return true; } @@ -469,7 +468,7 @@ bool FinalRenderEmberController::CreateRenderer(eRendererType renderType, uns m_Renderer->Callback(this); m_Renderer->NumChannels(channels); - m_Renderer->ReclaimOnResize(false); + m_Renderer->ReclaimOnResize(true); m_Renderer->EarlyClip(m_FinalRender->EarlyClip()); m_Renderer->YAxisUp(m_FinalRender->YAxisUp()); m_Renderer->ThreadCount(m_FinalRender->ThreadCount()); @@ -506,9 +505,9 @@ unsigned __int64 FinalRenderEmberController::SyncAndComputeMemory() m_Renderer->NumChannels(channels); m_Renderer->ComputeBounds(); CancelPreviewRender(); - //m_PreviewResult = QtConcurrent::run(m_PreviewRenderFunc); - //while (!m_PreviewResult.isRunning()) { QApplication::processEvents(); }//Wait for it to start up. - m_PreviewRenderFunc(); + //m_FinalPreviewResult = QtConcurrent::run(m_PreviewRenderFunc); + //while (!m_FinalPreviewResult.isRunning()) { QApplication::processEvents(); }//Wait for it to start up. + m_FinalPreviewRenderFunc(); return m_Renderer->MemoryRequired(true); } @@ -536,11 +535,11 @@ void FinalRenderEmberController::ResetProgress(bool total) template void FinalRenderEmberController::CancelPreviewRender() { - m_PreviewRenderer->Abort(); + m_FinalPreviewRenderer->Abort(); - while (m_PreviewRenderer->InRender()) { QApplication::processEvents(); } + while (m_FinalPreviewRenderer->InRender()) { QApplication::processEvents(); } while (m_PreviewRun) { QApplication::processEvents(); } - while (m_PreviewResult.isRunning()) { QApplication::processEvents(); } + while (m_FinalPreviewResult.isRunning()) { QApplication::processEvents(); } } /// diff --git a/Source/Fractorium/FinalRenderEmberController.h b/Source/Fractorium/FinalRenderEmberController.h index 5d59556..373d7d0 100644 --- a/Source/Fractorium/FinalRenderEmberController.h +++ b/Source/Fractorium/FinalRenderEmberController.h @@ -61,10 +61,9 @@ public: virtual unsigned __int64 SyncAndComputeMemory() { return 0; } virtual QString Name() const { return ""; } virtual void ResetProgress(bool total = true) { } + virtual void SetOriginalEmber(Ember& ember) { } #ifdef DO_DOUBLE virtual void SetOriginalEmber(Ember& ember) { } -#else - virtual void SetOriginalEmber(Ember& ember) { } #endif virtual double OriginalAspect() { return 1; } @@ -79,10 +78,9 @@ protected: double m_PureIterTime; QFuture m_Result; - QFuture m_PreviewResult; - std::function m_RenderFunc; - std::function m_PreviewRenderFunc; - vector m_PreviewFinalImage; + QFuture m_FinalPreviewResult; + std::function m_FinalRenderFunc; + std::function m_FinalPreviewRenderFunc; FractoriumSettings* m_Settings; FractoriumFinalRenderDialog* m_FinalRender; @@ -108,14 +106,13 @@ public: virtual void CopyEmber(Ember& ember); virtual void SetEmberFile(const EmberFile& emberFile); virtual void CopyEmberFile(EmberFile& emberFile); + virtual void SetOriginalEmber(Ember& ember); #ifdef DO_DOUBLE virtual void SetEmber(const Ember& ember, bool verbatim = false); virtual void CopyEmber(Ember& ember); virtual void SetEmberFile(const EmberFile& emberFile); virtual void CopyEmberFile(EmberFile& emberFile); virtual void SetOriginalEmber(Ember& ember); -#else - virtual void SetOriginalEmber(Ember& ember); #endif virtual double OriginalAspect(); virtual int ProgressFunc(Ember& ember, void* foo, double fraction, int stage, double etaMs); @@ -135,7 +132,7 @@ protected: Ember m_PreviewEmber; EmberFile m_EmberFile; EmberToXml m_XmlWriter; - auto_ptr> m_PreviewRenderer; + auto_ptr> m_FinalPreviewRenderer; }; template class FinalRenderEmberController; diff --git a/Source/Fractorium/Fractorium.rc b/Source/Fractorium/Fractorium.rc index 1de2939..a4c5e63 100644 Binary files a/Source/Fractorium/Fractorium.rc and b/Source/Fractorium/Fractorium.rc differ