shun-iwasawa 13c4cf
#pragma once
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
#ifndef IWA_PAINTBRUSHFX_H
shun-iwasawa 13c4cf
#define IWA_PAINTBRUSHFX_H
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
#include "stdfx.h"
shun-iwasawa 13c4cf
#include "tfxparam.h"
shun-iwasawa 13c4cf
#include "tparamset.h"
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
#include <QVector>
shun-iwasawa 13c4cf
#include <QMap>
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
struct double2 {
shun-iwasawa 13c4cf
  double x, y;
shun-iwasawa 13c4cf
};
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
struct colorRGBA {
shun-iwasawa 13c4cf
  double r, g, b, a;
shun-iwasawa 13c4cf
};
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
struct BrushStroke {
shun-iwasawa 13c4cf
  QVector<TPointD> centerPos;
shun-iwasawa 13c4cf
  TPointD originPos;
shun-iwasawa 13c4cf
  colorRGBA color;
shun-iwasawa 13c4cf
  double length;
shun-iwasawa 13c4cf
  double widthHalf;
shun-iwasawa 13c4cf
  double angle;
shun-iwasawa 13c4cf
  int textureId;
shun-iwasawa 13c4cf
  bool invert;
shun-iwasawa 13c4cf
  double randomVal;
shun-iwasawa 13c4cf
  double stack;  // 整列用の値
shun-iwasawa 13c4cf
};
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
struct BrushVertex {
shun-iwasawa 13c4cf
  double pos[2];
shun-iwasawa 13c4cf
  double texCoord[2];
shun-iwasawa 13c4cf
  BrushVertex(const TPointD _pos, double u, double v) {
shun-iwasawa 13c4cf
    pos[0]      = _pos.x;
shun-iwasawa 13c4cf
    pos[1]      = _pos.y;
shun-iwasawa 13c4cf
    texCoord[0] = u;
shun-iwasawa 13c4cf
    texCoord[1] = v;
shun-iwasawa 13c4cf
  }
shun-iwasawa 13c4cf
  BrushVertex() : BrushVertex(TPointD(), 0, 0) {}
shun-iwasawa 13c4cf
};
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
struct FlowPaintBrushFxParam {
shun-iwasawa 13c4cf
  TDimensionI dim;
shun-iwasawa 13c4cf
  TPointD origin_pos;
shun-iwasawa 13c4cf
  TPointD horiz_pos;
shun-iwasawa 13c4cf
  TPointD vert_pos;
shun-iwasawa 13c4cf
  TRectD bbox;
shun-iwasawa 13c4cf
  int fill_gap_size;
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  double h_density;
shun-iwasawa 13c4cf
  double v_density;
shun-iwasawa 13c4cf
  double pos_randomness;
shun-iwasawa 13c4cf
  double pos_wobble;
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  int random_seed;
shun-iwasawa 13c4cf
  DoublePair tipLength;
shun-iwasawa 13c4cf
  DoublePair tipWidth;
shun-iwasawa 13c4cf
  DoublePair tipAlpha;
shun-iwasawa 13c4cf
  double width_random;
shun-iwasawa 13c4cf
  double length_random;
shun-iwasawa 13c4cf
  double angle_random;
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  int reso;
shun-iwasawa 13c4cf
  bool anti_jaggy;
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  TPointD hVec;
shun-iwasawa 13c4cf
  TPointD vVec;
shun-iwasawa 13c4cf
  double2 vVec_unit;
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  TAffine brushAff;
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  int lastFrame;
shun-iwasawa 13c4cf
};
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
class Iwa_FlowPaintBrushFx final : public TStandardRasterFx {
shun-iwasawa 13c4cf
  FX_PLUGIN_DECLARATION(Iwa_FlowPaintBrushFx)
shun-iwasawa 13c4cf
public:
shun-iwasawa 13c4cf
  enum StackMode {
shun-iwasawa 13c4cf
    NoSort = 0,
shun-iwasawa 13c4cf
    Smaller,
shun-iwasawa 13c4cf
    Larger,
shun-iwasawa 13c4cf
    Darker,
shun-iwasawa 13c4cf
    Brighter,
shun-iwasawa 13c4cf
    Random
shun-iwasawa 13c4cf
    //,TestModeArea
shun-iwasawa 13c4cf
  };
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
private:
shun-iwasawa 13c4cf
  TRasterFxPort m_brush;
shun-iwasawa 13c4cf
  TRasterFxPort m_flow;
shun-iwasawa 13c4cf
  TRasterFxPort m_area;
shun-iwasawa 13c4cf
  TRasterFxPort m_color;
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  // 密度
shun-iwasawa 13c4cf
  TDoubleParamP m_h_density;
shun-iwasawa 13c4cf
  TDoubleParamP m_v_density;
shun-iwasawa 13c4cf
  // 位置のランダムさ(0:格子状 1:一様にランダム <1: ばらつき増加)
shun-iwasawa 13c4cf
  TDoubleParamP m_pos_randomness;
shun-iwasawa 13c4cf
  TDoubleParamP m_pos_wobble;
shun-iwasawa 13c4cf
  // タッチのサイズ(Areaの値によって変化)
shun-iwasawa 13c4cf
  TRangeParamP m_tip_width;
shun-iwasawa 13c4cf
  TRangeParamP m_tip_length;
shun-iwasawa 13c4cf
  // タッチの不透明度
shun-iwasawa 13c4cf
  TRangeParamP m_tip_alpha;
shun-iwasawa 13c4cf
  TIntParamP m_tip_joints;
shun-iwasawa 13c4cf
  TBoolParamP m_bidirectional;
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  // ばらつき
shun-iwasawa 13c4cf
  TDoubleParamP m_width_randomness;
shun-iwasawa 13c4cf
  TDoubleParamP m_length_randomness;
shun-iwasawa 13c4cf
  TDoubleParamP m_angle_randomness;  // degreeで
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  TDoubleParamP m_sustain_width_to_skew;
shun-iwasawa 13c4cf
  TBoolParamP m_anti_jaggy;
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  // 生成範囲
shun-iwasawa 13c4cf
  TPointParamP m_origin_pos;
shun-iwasawa 13c4cf
  TPointParamP m_horizontal_pos;
shun-iwasawa 13c4cf
  TPointParamP m_vertical_pos;
shun-iwasawa 13c4cf
  TPointParamP m_curve_point;
shun-iwasawa 13c4cf
  TDoubleParamP m_fill_gap_size;
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  // 基準フレーム
shun-iwasawa 13c4cf
  TDoubleParamP m_reference_frame;
shun-iwasawa 13c4cf
  // 基準フレームを使って生成するタッチの割合
shun-iwasawa 13c4cf
  TDoubleParamP m_reference_prevalence;
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  // ランダムシード
shun-iwasawa 13c4cf
  TIntParamP m_random_seed;
shun-iwasawa 13c4cf
  // 並べ替え
shun-iwasawa 13c4cf
  TIntEnumParamP m_sortBy;
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  // ブラシタッチのラスターデータを取得
shun-iwasawa 13c4cf
  void getBrushRasters(std::vector<TRasterP> &brushRasters, TDimension &b_size,
shun-iwasawa 13c4cf
                       int &lastFrame, TTile &tile, const TRenderSettings &ri);
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  template <typename RASTER, typename PIXEL>
shun-iwasawa 13c4cf
  void setFlowTileToBuffer(const RASTER flowRas, double2 *buf);
shun-iwasawa 13c4cf
  template <typename RASTER, typename PIXEL>
shun-iwasawa 13c4cf
  void setAreaTileToBuffer(const RASTER areaRas, double *buf);
shun-iwasawa 13c4cf
  template <typename RASTER, typename PIXEL>
shun-iwasawa 13c4cf
  void setColorTileToBuffer(const RASTER colorRas, colorRGBA *buf);
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  // ためしに
shun-iwasawa 13c4cf
  template <typename RASTER, typename PIXEL>
shun-iwasawa 13c4cf
  void setOutRaster(const RASTER outRas, double *buf);
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  void fillGapByDilateAndErode(double *buf, const TDimension &dim,
shun-iwasawa 13c4cf
                               const int fill_gap_size);
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  void computeBrushVertices(QVector<BrushVertex> &brushVertices,
shun-iwasawa 13c4cf
                            QList<BrushStroke> &brushStrokes,
shun-iwasawa 13c4cf
                            FlowPaintBrushFxParam &p, TTile &tile, double frame,
shun-iwasawa 13c4cf
                            const TRenderSettings &ri);
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  double getSizePixelAmount(const double val, const TAffine affine);
shun-iwasawa 13c4cf
  FlowPaintBrushFxParam getParam(TTile &tile, double frame,
shun-iwasawa 13c4cf
                                 const TRenderSettings &ri);
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
public:
shun-iwasawa 13c4cf
  Iwa_FlowPaintBrushFx();
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  bool canHandle(const TRenderSettings &info, double frame) override {
shun-iwasawa 13c4cf
    return true;
shun-iwasawa 13c4cf
  }
shun-iwasawa 13c4cf
  bool doGetBBox(double frame, TRectD &bBox,
shun-iwasawa 13c4cf
                 const TRenderSettings &info) override;
shun-iwasawa 13c4cf
  void doCompute(TTile &tile, double frame, const TRenderSettings &ri) override;
shun-iwasawa 13c4cf
  void getParamUIs(TParamUIConcept *&concepts, int &length) override;
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
  std::string getAlias(double frame,
shun-iwasawa 13c4cf
                       const TRenderSettings &info) const override;
shun-iwasawa 13c4cf
};
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
#endif