00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef LUX_FLEXIMAGE_H
00024 #define LUX_FLEXIMAGE_H
00025
00026 #include "lux.h"
00027 #include "film.h"
00028 #include "color.h"
00029 #include "paramset.h"
00030 #include "tonemap.h"
00031 #include "sampling.h"
00032 #include "filter.h"
00033 #include <boost/thread/xtime.hpp>
00034
00035 namespace lux {
00036
00037
00038 class FlexImageFilm : public Film {
00039 public:
00040 enum OutputChannels { Y, YA, RGB, RGBA };
00041 enum ZBufNormalization { None, CameraStartEnd, MinMax };
00042
00043
00044
00045 FlexImageFilm(int xres, int yres, Filter *filt, const float crop[4],
00046 const string &filename1, bool premult, int wI, int dI, int cM,
00047 bool cw_EXR, OutputChannels cw_EXR_channels, bool cw_EXR_halftype, int cw_EXR_compressiontype, bool cw_EXR_applyimaging,
00048 bool cw_EXR_gamutclamp, bool cw_EXR_ZBuf, ZBufNormalization cw_EXR_ZBuf_normalizationtype,
00049 bool cw_PNG, OutputChannels cw_PNG_channels, bool cw_PNG_16bit, bool cw_PNG_gamutclamp, bool cw_PNG_ZBuf, ZBufNormalization cw_PNG_ZBuf_normalizationtype,
00050 bool cw_TGA, OutputChannels cw_TGA_channels, bool cw_TGA_gamutclamp, bool cw_TGA_ZBuf, ZBufNormalization cw_TGA_ZBuf_normalizationtype,
00051 bool w_resume_FLM, bool restart_resume_FLM, int haltspp, int halttime,
00052 int p_TonemapKernel, float p_ReinhardPreScale, float p_ReinhardPostScale,
00053 float p_ReinhardBurn, float p_LinearSensitivity, float p_LinearExposure, float p_LinearFStop, float p_LinearGamma,
00054 float p_ContrastDisplayAdaptionY, float p_Gamma,
00055 const float cs_red[2], const float cs_green[2], const float cs_blue[2], const float whitepoint[2],
00056 int reject_warmup, bool debugmode);
00057
00058 virtual ~FlexImageFilm() {
00059 delete[] framebuffer;
00060 if(use_Zbuf && ZBuffer)
00061 delete ZBuffer;
00062 delete[] filterTable;
00063 delete filter;
00064 }
00065
00066 virtual void RequestBufferGroups(const vector<string> &bg);
00067 virtual int RequestBuffer(BufferType type, BufferOutputConfig output, const string& filePostfix);
00068 virtual void CreateBuffers();
00069 virtual u_int GetNumBufferConfigs() const { return bufferConfigs.size(); }
00070 virtual const BufferConfig& GetBufferConfig( u_int index ) const { return bufferConfigs[index]; }
00071 virtual u_int GetNumBufferGroups() const { return bufferGroups.size(); }
00072 virtual void SetGroupName(u_int index, const string& name);
00073 virtual string GetGroupName(u_int index) const;
00074 virtual void SetGroupEnable(u_int index, bool status);
00075 virtual bool GetGroupEnable(u_int index) const;
00076 virtual void SetGroupScale(u_int index, float value);
00077 virtual float GetGroupScale(u_int index) const;
00078 virtual void SetGroupRGBScale(u_int index, const RGBColor &value);
00079 virtual RGBColor GetGroupRGBScale(u_int index) const;
00080 virtual void SetGroupTemperature(u_int index, float value);
00081 virtual float GetGroupTemperature(u_int index) const;
00082 virtual void ComputeGroupScale(u_int index);
00083
00084 virtual u_int GetXPixelCount() const { return xPixelCount; }
00085 virtual u_int GetYPixelCount() const { return yPixelCount; }
00086
00087 virtual void GetSampleExtent(int *xstart, int *xend, int *ystart, int *yend) const;
00088 virtual void AddSample(Contribution *contrib);
00089 virtual void AddSampleCount(float count);
00090
00091 virtual void WriteImage(ImageType type);
00092 virtual void CheckWriteOuputInterval();
00093
00094
00095 virtual void updateFrameBuffer();
00096 virtual unsigned char* getFrameBuffer();
00097 virtual void createFrameBuffer();
00098 virtual float getldrDisplayInterval() {
00099 return displayInterval;
00100 }
00101
00102
00103 virtual void SetParameterValue(luxComponentParameters param, double value, int index);
00104 virtual double GetParameterValue(luxComponentParameters param, int index);
00105 virtual double GetDefaultParameterValue(luxComponentParameters param, int index);
00106 virtual void SetStringParameterValue(luxComponentParameters param, const string& value, int index);
00107 virtual string GetStringParameterValue(luxComponentParameters param, int index);
00108
00109 virtual void WriteFilm(const string &fname) { WriteResumeFilm(fname); }
00110
00111 virtual void TransmitFilm(std::basic_ostream<char> &stream,bool clearBuffers = true,bool transmitParams=false);
00112 virtual float UpdateFilm(std::basic_istream<char> &stream);
00113
00114 static Film *CreateFilm(const ParamSet ¶ms, Filter *filter);
00119 static Film *CreateFilmFromFLM(const string &flmFileName);
00120
00121 private:
00122 static void GetColorspaceParam(const ParamSet ¶ms, const string name, float values[2]);
00123
00124 void WriteImage2(ImageType type, vector<XYZColor> &color, vector<float> &alpha, string postfix);
00125 void WriteTGAImage(vector<RGBColor> &rgb, vector<float> &alpha, const string &filename);
00126 void WritePNGImage(vector<RGBColor> &rgb, vector<float> &alpha, const string &filename);
00127 void WriteEXRImage(vector<RGBColor> &rgb, vector<float> &alpha, const string &filename, vector<float> &zbuf);
00128 void WriteResumeFilm(const string &filename);
00129
00130
00131 Filter *filter;
00132 int writeInterval;
00133 int displayInterval;
00134 int clampMethod;
00135 string filename;
00136 bool premultiplyAlpha, buffersInited;
00137 float cropWindow[4], *filterTable;
00138 int xPixelStart, yPixelStart, xPixelCount, yPixelCount;
00139
00140
00141 double reject_warmup_samples;
00142
00143
00144 bool write_EXR, write_EXR_halftype, write_EXR_applyimaging, write_EXR_gamutclamp, write_EXR_ZBuf;
00145 bool write_PNG, write_PNG_16bit, write_PNG_gamutclamp, write_PNG_ZBuf;
00146 bool write_TGA,write_TGA_gamutclamp, write_TGA_ZBuf;
00147 int write_EXR_compressiontype;
00148 ZBufNormalization write_EXR_ZBuf_normalizationtype;
00149 OutputChannels write_EXR_channels;
00150 ZBufNormalization write_PNG_ZBuf_normalizationtype;
00151 OutputChannels write_PNG_channels;
00152 ZBufNormalization write_TGA_ZBuf_normalizationtype;
00153 OutputChannels write_TGA_channels;
00154
00155 bool use_Zbuf;
00156 PerPixelNormalizedFloatBuffer *ZBuffer;
00157
00158 bool writeResumeFlm, restartResumeFlm;
00159
00160 unsigned char *framebuffer;
00161
00162 boost::xtime lastWriteImageTime;
00163
00164 bool debug_mode;
00165
00166 std::vector<BufferConfig> bufferConfigs;
00167 std::vector<BufferGroup> bufferGroups;
00168
00169 float maxY;
00170 double warmupSamples;
00171 bool warmupComplete;
00172 ColorSystem colorSpace;
00173
00174 int m_TonemapKernel, d_TonemapKernel;
00175 float m_ReinhardPreScale, d_ReinhardPreScale;
00176 float m_ReinhardPostScale, d_ReinhardPostScale;
00177 float m_ReinhardBurn, d_ReinhardBurn;
00178 float m_LinearSensitivity, d_LinearSensitivity;
00179 float m_LinearExposure, d_LinearExposure;
00180 float m_LinearFStop, d_LinearFStop;
00181 float m_LinearGamma, d_LinearGamma;
00182 float m_ContrastYwa, d_ContrastYwa;
00183 float m_RGB_X_White, d_RGB_X_White;
00184 float m_RGB_Y_White, d_RGB_Y_White;
00185 float m_RGB_X_Red, d_RGB_X_Red;
00186 float m_RGB_Y_Red, d_RGB_Y_Red;
00187 float m_RGB_X_Green, d_RGB_X_Green;
00188 float m_RGB_Y_Green, d_RGB_Y_Green;
00189 float m_RGB_X_Blue, d_RGB_X_Blue;
00190 float m_RGB_Y_Blue, d_RGB_Y_Blue;
00191 float m_Gamma, d_Gamma;
00192
00193 GREYCStorationParams m_GREYCStorationParams, d_GREYCStorationParams;
00194 ChiuParams m_chiuParams, d_chiuParams;
00195
00196 XYZColor * m_bloomImage;
00197 bool m_BloomUpdateLayer;
00198 bool m_BloomDeleteLayer;
00199 bool m_HaveBloomImage;
00200 float m_BloomRadius, d_BloomRadius;
00201 float m_BloomWeight, d_BloomWeight;
00202
00203 bool m_VignettingEnabled, d_VignettingEnabled;
00204 float m_VignettingScale, d_VignettingScale;
00205
00206 bool m_AberrationEnabled, d_AberrationEnabled;
00207 float m_AberrationAmount, d_AberrationAmount;
00208
00209 XYZColor * m_glareImage;
00210 bool m_GlareUpdateLayer;
00211 bool m_GlareDeleteLayer;
00212 bool m_HaveGlareImage;
00213 float m_GlareAmount, d_GlareAmount;
00214 float m_GlareRadius, d_GlareRadius;
00215 int m_GlareBlades, d_GlareBlades;
00216
00217 bool m_HistogramEnabled, d_HistogramEnabled;
00218 };
00219
00220 }
00221
00222 #endif //LUX_FLEXIMAGE_H
00223