Blob Blame Raw
#pragma once
//----------------------------------------
// Iwa_BokehAdvancedFx
// Advanced version of Bokeh Fx Iwa
// - Enabled to set different hardness for each layer
// - Enabled to apply the depth reference image for each layer
//----------------------------------------

#ifndef IWA_BOKEH_ADVANCED_H
#define IWA_BOKEH_ADVANCED_H

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

#include "kiss_fft.h"
#include "tools/kiss_fftnd.h"
#include "iwa_bokeh_util.h"

#include <array>
#include <QThread>

const int LAYER_NUM = 5;

//------------------------------------

class Iwa_BokehAdvancedFx : public Iwa_BokehCommonFx {
  FX_PLUGIN_DECLARATION(Iwa_BokehAdvancedFx)

protected:
  TFxPortDG m_control;

  TBoolParamP m_hardnessPerSource;  // switch between layer and master hardness

  struct LAYERPARAM {
    TRasterFxPort m_source;
    TDoubleParamP m_distance;  // The layer distance from the camera (0-1)
    TDoubleParamP m_bokehAdjustment;  // Factor for adjusting distance (= focal
                                      // distance - layer distance) (0-2.0)
    TDoubleParamP m_hardness;         // film gamma for each layer
    TIntParamP m_depth_ref;           // port index of depth reference image
    TDoubleParamP m_depthRange;       // distance range varies depends on the
                                      // brightness of the reference image (0-1)
  };
  std::array<LAYERPARAM, LAYER_NUM> m_layerParams;

  // sort source images
  QList<int> getSortedSourceIndices(double frame);
  // Compute the bokeh size for each layer. The source tile will be enlarged by
  // the largest size of them.
  QMap<int, double> getIrisSizes(const double frame,
                                 const QList<int> sourceIndices,
                                 const double bokehPixelAmount,
                                 double& maxIrisSize);
  // return true if the control image is available and used
  bool portIsUsed(int portIndex);

public:
  Iwa_BokehAdvancedFx();

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

  int dynamicPortGroupsCount() const override { return 1; }
  const TFxPortDG* dynamicPortGroup(int g) const override {
    return (g == 0) ? &m_control : 0;
  }
};

#endif