diff --git a/Builds/MSVC/Installer/FractoriumInstaller.wixproj b/Builds/MSVC/Installer/FractoriumInstaller.wixproj index 5704658..77ef0de 100644 --- a/Builds/MSVC/Installer/FractoriumInstaller.wixproj +++ b/Builds/MSVC/Installer/FractoriumInstaller.wixproj @@ -6,7 +6,7 @@ 3.7 {c8096c47-e358-438c-a520-146d46b0637d} 2.0 - Fractorium_Beta_0.4.1.5 + Fractorium_Beta_0.4.1.6 Package $(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets $(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets diff --git a/Builds/MSVC/Installer/Product.wxs b/Builds/MSVC/Installer/Product.wxs index 9f1b883..84b661c 100644 --- a/Builds/MSVC/Installer/Product.wxs +++ b/Builds/MSVC/Installer/Product.wxs @@ -1,6 +1,6 @@ - + @@ -13,7 +13,7 @@ - + ::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/RendererBase.h b/Source/Ember/RendererBase.h index ae235ad..fa1f7b2 100644 --- a/Source/Ember/RendererBase.h +++ b/Source/Ember/RendererBase.h @@ -99,7 +99,6 @@ public: void ChangeVal(std::function func, eProcessAction action); size_t MemoryRequired(size_t strips, bool includeFinal); vector> RandVec(); - bool RandVec(vector>& randVec); bool PrepFinalAccumVector(vector& pixels); //Virtual processing functions. @@ -109,6 +108,7 @@ public: virtual void SetEmber(vector>& embers) { } virtual void SetEmber(Ember& ember, eProcessAction action = FULL_RENDER) { } virtual void SetEmber(vector>& embers) { } + virtual bool RandVec(vector>& randVec); //Abstract processing functions. virtual bool CreateDEFilter(bool& newAlloc) = 0; diff --git a/Source/EmberAnimate/EmberAnimate.rc b/Source/EmberAnimate/EmberAnimate.rc index 7ec4eec..78e46c9 100644 --- a/Source/EmberAnimate/EmberAnimate.rc +++ b/Source/EmberAnimate/EmberAnimate.rc @@ -49,8 +49,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,4,1,5 - PRODUCTVERSION 0,4,1,5 + FILEVERSION 0,4,1,6 + PRODUCTVERSION 0,4,1,6 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.5" + VALUE "FileVersion", "0.4.1.6" 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.5" + VALUE "ProductVersion", "0.4.1.6" END END BLOCK "VarFileInfo" diff --git a/Source/EmberCL/RendererCL.cpp b/Source/EmberCL/RendererCL.cpp index bd43bb6..9f3d876 100644 --- a/Source/EmberCL/RendererCL.cpp +++ b/Source/EmberCL/RendererCL.cpp @@ -52,14 +52,8 @@ RendererCL::RendererCL(unsigned int platform, unsigned int device, bool share 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 2BPC outputs for PNG. - m_Seeds.resize(IterGridKernelCount()); - - for (size_t i = 0; i < m_Seeds.size(); i++) - { - m_Seeds[i].x = m_Rand[0].Rand(); - m_Seeds[i].y = m_Rand[0].Rand(); - } - + + FillSeeds(); Init(platform, device, shared, outputTexID);//Init OpenCL upon construction and create programs that will not change. } @@ -498,6 +492,27 @@ vector RendererCL::ErrorReport() return ours; } +/// +/// Set the vector of random contexts. +/// Call the base, and reset the seeds vector. +/// +/// The vector of random contexts to assign +/// True if the size of the vector matched the number of threads used for rendering and writing seeds to OpenCL succeeded, else false. +template +bool RendererCL::RandVec(vector>& randVec) +{ + bool b = Renderer::RandVec(randVec); + const char* loc = __FUNCTION__; + + if (m_Wrapper.Ok()) + { + FillSeeds(); + if (b && !(b = m_Wrapper.AddAndWriteBuffer(m_SeedsBufferName, (void*)m_Seeds.data(), SizeOf(m_Seeds)))) { m_ErrorReport.push_back(loc); } + } + + return b; +} + /// /// Protected virtual functions overridden from Renderer. /// @@ -912,6 +927,9 @@ eRenderStatus RendererCL::RunLogScaleFilter() m_ErrorReport.push_back(loc); } + if (b && m_Callback) + m_Callback->ProgressFunc(m_Ember, m_ProgressParameter, 100.0, 1, 0.0); + return b ? RENDER_OK : RENDER_ERROR; } @@ -996,9 +1014,9 @@ eRenderStatus RendererCL::RunDensityFilter() } } #else - OpenCLWrapper::MakeEvenGridDims(blockSizeW, blockSizeH, gridW, gridH); gridW /= chunkSizeW; gridH /= chunkSizeH; + OpenCLWrapper::MakeEvenGridDims(blockSizeW, blockSizeH, gridW, gridH); for (unsigned int rowChunk = 0; b && !m_Abort && rowChunk < chunkSizeH; rowChunk++) { @@ -1432,4 +1450,21 @@ CarToRasCL RendererCL::ConvertCarToRas(const CarToRas& carToRas) return carToRasCL; } + +/// +/// Fill seeds buffer which gets passed to the iteration kernel. +/// Note, WriteBuffer() must be called after this to actually copy the +/// data from the host to the device. +/// +template +void RendererCL::FillSeeds() +{ + m_Seeds.resize(IterGridKernelCount()); + + for (size_t i = 0; i < m_Seeds.size(); i++) + { + m_Seeds[i].x = m_Rand[0].Rand(); + m_Seeds[i].y = m_Rand[0].Rand(); + } +} } \ No newline at end of file diff --git a/Source/EmberCL/RendererCL.h b/Source/EmberCL/RendererCL.h index 677afbd..1aaeaad 100644 --- a/Source/EmberCL/RendererCL.h +++ b/Source/EmberCL/RendererCL.h @@ -93,6 +93,7 @@ public: virtual eRendererType RendererType() const override; virtual string ErrorReportString() override; virtual vector ErrorReport() override; + virtual bool RandVec(vector>& randVec) override; #ifndef TEST_CL protected: @@ -118,6 +119,7 @@ private: int MakeAndGetDensityFilterProgram(size_t ss, unsigned int filterWidth); int MakeAndGetFinalAccumProgram(T& alphaBase, T& alphaScale); int MakeAndGetGammaCorrectionProgram(); + void FillSeeds(); //Private functions passing data to OpenCL programs. DensityFilterCL ConvertDensityFilter(); diff --git a/Source/EmberGenome/EmberGenome.rc b/Source/EmberGenome/EmberGenome.rc index b246fdc..dcafd67 100644 --- a/Source/EmberGenome/EmberGenome.rc +++ b/Source/EmberGenome/EmberGenome.rc @@ -49,8 +49,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,4,1,5 - PRODUCTVERSION 0,4,1,5 + FILEVERSION 0,4,1,6 + PRODUCTVERSION 0,4,1,6 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.5" + VALUE "FileVersion", "0.4.1.6" 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.5" + VALUE "ProductVersion", "0.4.1.6" END END BLOCK "VarFileInfo" diff --git a/Source/EmberRender/EmberRender.rc b/Source/EmberRender/EmberRender.rc index 1fa4a0e..3e638f0 100644 --- a/Source/EmberRender/EmberRender.rc +++ b/Source/EmberRender/EmberRender.rc @@ -49,8 +49,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,4,1,5 - PRODUCTVERSION 0,4,1,5 + FILEVERSION 0,4,1,6 + PRODUCTVERSION 0,4,1,6 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.5" + VALUE "FileVersion", "0.4.1.6" 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.5" + VALUE "ProductVersion", "0.4.1.6" END END BLOCK "VarFileInfo" diff --git a/Source/Fractorium/AboutDialog.ui b/Source/Fractorium/AboutDialog.ui index 0020c90..cdd67d3 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.5 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.6 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 806e484..99cc86f 100644 --- a/Source/Fractorium/FinalRenderEmberController.cpp +++ b/Source/Fractorium/FinalRenderEmberController.cpp @@ -118,7 +118,7 @@ FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderD m_PreviewEmber.m_FinalRasW = max(1, min(maxDim, size_t(scalePercentage * m_Ember->m_FinalRasW)));//Ensure neither is zero. m_PreviewEmber.m_FinalRasH = max(1, min(maxDim, size_t(scalePercentage * m_Ember->m_FinalRasH))); m_PreviewEmber.m_PixelsPerUnit = scalePercentage * m_Ember->m_PixelsPerUnit; - + m_FinalPreviewRenderer->EarlyClip(m_FinalRenderDialog->EarlyClip()); m_FinalPreviewRenderer->YAxisUp(m_FinalRenderDialog->YAxisUp()); m_FinalPreviewRenderer->Transparency(m_FinalRenderDialog->Transparency()); diff --git a/Source/Fractorium/Fractorium.rc b/Source/Fractorium/Fractorium.rc index 0ab71fc..85a8ebb 100644 Binary files a/Source/Fractorium/Fractorium.rc and b/Source/Fractorium/Fractorium.rc differ diff --git a/Source/Fractorium/FractoriumEmberController.cpp b/Source/Fractorium/FractoriumEmberController.cpp index 2b615ab..1be19dc 100644 --- a/Source/Fractorium/FractoriumEmberController.cpp +++ b/Source/Fractorium/FractoriumEmberController.cpp @@ -101,6 +101,7 @@ FractoriumEmberController::FractoriumEmberController(Fractorium* fractorium) { Ember ember = m_EmberFile.m_Embers[i]; + ember.SyncSize(); ember.SetSizeAndAdjustScale(PREVIEW_SIZE, PREVIEW_SIZE, false, SCALE_WIDTH); ember.m_TemporalSamples = 1; ember.m_Quality = 25; diff --git a/Source/Fractorium/FractoriumMenus.cpp b/Source/Fractorium/FractoriumMenus.cpp index bb68f4d..92a12d0 100644 --- a/Source/Fractorium/FractoriumMenus.cpp +++ b/Source/Fractorium/FractoriumMenus.cpp @@ -62,8 +62,6 @@ void FractoriumEmberController::NewFlock(unsigned int count) m_SheepTools->Random(ember); ParamsToEmber(ember); ember.m_Index = i; - ember.m_OrigFinalRasW = ember.m_FinalRasW; - ember.m_OrigFinalRasH = ember.m_FinalRasH; ember.m_Name = m_EmberFile.m_Filename.toStdString() + "-" + ToString(i + 1).toStdString(); m_EmberFile.m_Embers.push_back(ember); } @@ -97,8 +95,6 @@ void FractoriumEmberController::NewEmptyFlameInCurrentFile() StopPreviewRender(); ParamsToEmber(ember); - ember.m_OrigFinalRasW = ember.m_FinalRasW; - ember.m_OrigFinalRasH = ember.m_FinalRasH; xform.m_Weight = T(0.25); xform.m_ColorX = m_Rand.Frand01(); ember.AddXform(xform); @@ -126,8 +122,6 @@ void FractoriumEmberController::NewRandomFlameInCurrentFile() StopPreviewRender(); m_SheepTools->Random(ember); ParamsToEmber(ember); - ember.m_OrigFinalRasW = ember.m_FinalRasW; - ember.m_OrigFinalRasH = ember.m_FinalRasH; ember.m_Name = EmberFile::DefaultEmberName(m_EmberFile.Size() + 1).toStdString(); ember.m_Index = m_EmberFile.Size(); m_EmberFile.m_Embers.push_back(ember);//Will invalidate the pointers contained in the EmberTreeWidgetItems, UpdateLibraryTree() will resync. diff --git a/Source/Fractorium/FractoriumParams.cpp b/Source/Fractorium/FractoriumParams.cpp index dec7e37..68ba34b 100644 --- a/Source/Fractorium/FractoriumParams.cpp +++ b/Source/Fractorium/FractoriumParams.cpp @@ -614,6 +614,8 @@ void FractoriumEmberController::ParamsToEmber(Ember& ember) ember.m_TemporalSamples = m_Fractorium->m_TemporalSamplesSpin->value(); ember.m_AffineInterp = (eAffineInterp)m_Fractorium->m_AffineInterpTypeCombo->currentIndex(); ember.m_Interp = (eInterp)m_Fractorium->m_InterpTypeCombo->currentIndex(); + + ember.SyncSize(); } ///