Blob Blame Raw
#pragma once

/*------------------------------------
Iwa_GlareFx
------------------------------------*/

#ifndef IWA_GLAREFX_H
#define IWA_GLAREFX_H

#include "stdfx.h"
#include "tfxparam.h"
#include "traster.h"
#include "tparamset.h"

#include <QList>
#include <QThread>

#include "tools/kiss_fftnd.h"

const int LAYER_NUM = 5;

struct double2 {
  double x, y;
};
struct int2 {
  int x, y;
};
struct double3 {
  double x, y, z;
};

class Iwa_GlareFx : public TStandardRasterFx {
  FX_PLUGIN_DECLARATION(Iwa_GlareFx)

protected:
  TRasterFxPort m_source;
  TRasterFxPort m_iris;
  // rendering mode (filter preview / render)
  TIntEnumParamP m_renderMode;
  TDoubleParamP m_intensity;
  TDoubleParamP m_size;

  TDoubleParamP m_rotation;

  TDoubleParamP m_noise_factor;
  TDoubleParamP m_noise_size;
  TIntEnumParamP m_noise_octave;
  TDoubleParamP m_noise_evolution;
  TPointParamP m_noise_offset;

  enum { RendeMode_FilterPreview = 0, RendeMode_Render };

  double getSizePixelAmount(const double val, const TAffine affine);

  // Resize / flip the iris image according to the size ratio.
  // Normalize the brightness of the iris image.
  // Enlarge the iris to the output size.
  void convertIris(kiss_fft_cpx *kissfft_comp_iris_before, const int &dimIris,
                   const TRectD &irisBBox, const TTile &irisTile);

  void powerSpectrum2GlarePattern(const double frame, const TAffine affine,
                                  kiss_fft_cpx *spectrum, double3 *glare,
                                  int dimIris, double intensity,
                                  double irisResizeFactor);

  void distortGlarePattern(const double frame, const TAffine affine,
                           double *glare, const int dimIris);

  // filter preview mode
  template <typename RASTER, typename PIXEL>
  void setFilterPreviewToResult(const RASTER ras, double3 *glare, int dimIris,
                                int2 margin);

  // put the source tile's brightness to fft buffer
  template <typename RASTER, typename PIXEL>
  void setSourceTileToBuffer(const RASTER ras, kiss_fft_cpx *buf);

  void setGlarePatternToBuffer(const double3 *glare, kiss_fft_cpx *buf,
                               const int channel, const int dimIris,
                               const TDimensionI &dimOut);

  void multiplyFilter(kiss_fft_cpx *glare, const kiss_fft_cpx *source,
                      const int count);

  template <typename RASTER, typename PIXEL>
  void setChannelToResult(const RASTER ras, kiss_fft_cpx *buf, int channel,
                          const TDimensionI &dimOut);

public:
  Iwa_GlareFx();

  void doCompute(TTile &tile, double frame, const TRenderSettings &settings);

  bool doGetBBox(double frame, TRectD &bBox, const TRenderSettings &info);

  bool canHandle(const TRenderSettings &info, double frame);

  void getParamUIs(TParamUIConcept *&concepts, int &length) override;
};

#endif