/**
* Mandelbulber v2, a 3D fractal generator ,=#MKNmMMKmmßMNWy,
* ,B" ]L,,p%%%,,,§;, "K
* Copyright (C) 2014-21 Mandelbulber Team §R-==%w["'~5]m%=L.=~5N
* ,=mm=§M ]=4 yJKA"/-Nsaj "Bw,==,,
* This file is part of Mandelbulber. §R.r= jw",M Km .mM FW ",§=ß., ,TN
* ,4R =%["w[N=7]J '"5=],""]]M,w,-; T=]M
* Mandelbulber is free software: §R.ß~-Q/M=,=5"v"]=Qf,'§"M= =,M.§ Rz]M"Kw
* you can redistribute it and/or §w "xDY.J ' -"m=====WeC=\ ""%""y=%"]"" §
* modify it under the terms of the "§M=M =D=4"N #"%==A%p M§ M6 R' #"=~.4M
* GNU General Public License as §W =, ][T"]C § § '§ e===~ U !§[Z ]N
* published by the 4M",,Jm=,"=e~ § § j]]""N BmM"py=ßM
* Free Software Foundation, ]§ T,M=& 'YmMMpM9MMM%=w=,,=MT]M m§;'§,
* either version 3 of the License, TWw [.j"5=~N[=§%=%W,T ]R,"=="Y[LFT ]N
* or (at your option) TW=,-#"%=;[ =Q:["V"" ],,M.m == ]N
* any later version. J§"mr"] ,=,," =="""J]= M"M"]==ß"
* §= "=C=4 §"eM "=B:m|4"]#F,§~
* Mandelbulber is distributed in "9w=,,]w em%wJ '"~" ,=,,ß"
* the hope that it will be useful, . "K= ,=RMMMßM"""
* but WITHOUT ANY WARRANTY; .'''
* without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* See the GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with Mandelbulber. If not, see .
*
* ###########################################################################
*
* Authors: Krzysztof Marczak (buddhi1980@gmail.com)
*
* cRenderJob class - prepare and coordinate rendering of single or multiple images (animation)
*/
#ifndef MANDELBULBER2_SRC_RENDER_JOB_HPP_
#define MANDELBULBER2_SRC_RENDER_JOB_HPP_
#ifndef _USE_MATH_DEFINES
#define _USE_MATH_DEFINES
#endif
#include
#include
#include "camera_target.hpp"
#include "fractal_container.hpp"
#include "parameters.hpp"
#include "region.hpp"
#include "rendered_tile_data.hpp"
#include "statistics.h"
// forward declarations
class cImage;
struct sRenderData;
class cRenderingConfiguration;
struct sImageOptional;
class cNineFractals;
class cRenderer;
class cProgressText;
struct sParamRender;
class cRenderJob : public QObject
{
Q_OBJECT
public:
cRenderJob(const std::shared_ptr _params,
const std::shared_ptr _fractal, std::shared_ptr _image,
bool *_stopRequest, QWidget *_qWidget = nullptr);
~cRenderJob() override;
// QWidget *parent is needed to connect signals for refreshing progress and status bar.
// If _parent is not nullptr then parent has to have slot slotUpdateProgressAndStatus()
enum enumMode
{
still,
keyframeAnim,
flightAnim,
flightAnimRecord
};
bool Init(enumMode _mode, const cRenderingConfiguration &config);
bool Execute();
std::shared_ptr GetImagePtr() const { return image; }
int GetNumberOfCPUs() const { return totalNumberOfCPUs; }
void UseSizeFromImage(bool modeInput) { useSizeFromImage = modeInput; }
void ChangeCameraTargetPosition(cCameraTarget &cameraTarget) const;
void UpdateParameters(const std::shared_ptr _params,
const std::shared_ptr _fractal);
void UpdateConfig(const cRenderingConfiguration &config) const;
static int GetRunningJobCount() { return runningJobs; }
cStatistics GetStatistics() const;
public slots:
void slotExecute();
private:
bool InitImage(int w, int h, const sImageOptional &optional);
void PrepareData();
void ReduceDetail() const;
QStringList CreateListOfUsedTextures() const;
int GetNumberOfRepeatsOfStereoLoop(bool *twoPassStereo);
void SetupStereoEyes(int repeat, bool twoPassStereo);
void InitNetRender();
void InitStatistics(const cNineFractals *fractals);
void ConnectUpdateSinalsSlots(const cRenderer *renderer);
void ConnectNetRenderSignalsSlots(const cRenderer *renderer);
#ifdef USE_OPENCL
bool RenderFractalWithOpenCl(std::shared_ptr params,
std::shared_ptr fractals, cProgressText *progressText);
void RenderSSAOWithOpenCl(std::shared_ptr params, const cRegion ®ion,
cProgressText *progressText, bool *result);
void RenderDOFWithOpenCl(std::shared_ptr params, bool *result);
void RenderPostFiltersWithOpenCl(std::shared_ptr params, const cRegion ®ion,
cProgressText *progressText, bool *result);
#endif
void LoadTextures(int frameNo, const cRenderingConfiguration &config);
bool hasQWidget;
bool inProgress;
bool ready;
bool useSizeFromImage;
std::shared_ptr image;
std::shared_ptr fractalContainer;
std::shared_ptr paramsContainer;
enumMode mode;
int height;
int totalNumberOfCPUs;
int width;
QWidget *imageWidget;
std::shared_ptr renderData;
bool *stopRequest;
bool canUseNetRender;
static int id; // global identifier of actual rendering job
static int runningJobs;
signals:
void finished();
void fullyRendered(const QString &text, const QString &progressText);
void fullyRenderedTime(double timeSeconds);
void updateProgressAndStatus(const QString &text, const QString &progressText, double progress);
void updateStatistics(cStatistics statistics);
void updateImage();
void sendRenderedTilesList(QList);
void SendNetRenderJob(std::shared_ptr settings,
std::shared_ptr fractal, QStringList listOfTextures);
void SendNetRenderSetup(int clientIndex, QList startingPositions);
void SetMinimumWidgetSize(int width, int height);
void signalTotalRenderTime(double seconds);
};
#endif /* MANDELBULBER2_SRC_RENDER_JOB_HPP_ */