#pragma once #ifndef IWA_FLOWBLURFX #define IWA_FLOWBLURFX #include "stdfx.h" #include "tfxparam.h" #include struct double2 { double x = 0., y = 0.; }; struct double4 { double x = 0., y = 0., z = 0, w = 0.; }; enum FILTER_TYPE { Linear = 0, Gaussian, Flat }; class FlowBlurWorker : public QThread { double4 *m_source_buf; double2 *m_flow_buf; double4 *m_out_buf; double *m_reference_buf; TDimension m_dim; double m_krnlen; int m_yFrom, m_yTo; FILTER_TYPE m_filterType; public: FlowBlurWorker(double4 *source_buf, double2 *flow_buf, double4 *out_buf, double *ref_buf, TDimension dim, double krnlen, int yFrom, int yTo, FILTER_TYPE filterType) : m_source_buf(source_buf) , m_flow_buf(flow_buf) , m_out_buf(out_buf) , m_reference_buf(ref_buf) , m_dim(dim) , m_krnlen(krnlen) , m_yFrom(yFrom) , m_yTo(yTo) , m_filterType(filterType) {} void run(); }; class Iwa_FlowBlurFx final : public TStandardRasterFx { FX_PLUGIN_DECLARATION(Iwa_FlowBlurFx) protected: TRasterFxPort m_source; TRasterFxPort m_flow; TRasterFxPort m_reference; TDoubleParamP m_length; TBoolParamP m_linear; TDoubleParamP m_gamma; /*- リニア/ガウシアン/平均化 -*/ TIntEnumParamP m_filterType; // Reference, Blue Channel of Flow Image TIntEnumParamP m_referenceMode; enum ReferenceMode { REFERENCE = 0, FLOW_BLUE_CHANNEL }; template void setSourceTileToBuffer(const RASTER srcRas, double4 *buf, bool isLinear, double gamma); template void setFlowTileToBuffer(const RASTER flowRas, double2 *buf, double *refBuf); template void setReferenceTileToBuffer(const RASTER srcRas, double *buf); template void setOutputRaster(double4 *out_buf, const RASTER dstRas, bool isLinear, double gamma); public: Iwa_FlowBlurFx(); void doCompute(TTile &tile, double frame, const TRenderSettings &settings) override; bool doGetBBox(double frame, TRectD &bBox, const TRenderSettings &info) override; bool canHandle(const TRenderSettings &info, double frame) override; }; #endif