Shinya Kitaoka 810553
#pragma once
Shinya Kitaoka 810553
Toshihiro Shimizu 890ddd
/*------------------------------------
Toshihiro Shimizu 890ddd
 Iwa_MotionBlurCompFx
Toshihiro Shimizu 890ddd
 露光量/オブジェクトの軌跡を考慮したモーションブラー
Toshihiro Shimizu 890ddd
 背景との露光値合成を可能にする
Toshihiro Shimizu 890ddd
//------------------------------------*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef IWA_MOTION_BLUR_COMP_H
Toshihiro Shimizu 890ddd
#define IWA_MOTION_BLUR_COMP_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tfxparam.h"
Toshihiro Shimizu 890ddd
#include "stdfx.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "motionawarebasefx.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TStageObjectId;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
struct float2 {
Toshihiro Shimizu 890ddd
	float x, y;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
struct float3 {
Toshihiro Shimizu 890ddd
	float x, y, z;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
struct float4 {
Toshihiro Shimizu 890ddd
	float x, y, z, w;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
struct int2 {
Toshihiro Shimizu 890ddd
	int x, y;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*- m_premultiTypeの取る値 -*/
Toshihiro Shimizu 890ddd
enum PremultiTypes {
Toshihiro Shimizu 890ddd
	AUTO = 0,
Toshihiro Shimizu 890ddd
	SOURCE_IS_PREMULTIPLIED,
Toshihiro Shimizu 890ddd
	SOURCE_IS_NOT_PREMUTIPLIED
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class Iwa_MotionBlurCompFx : public MotionAwareBaseFx
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FX_PLUGIN_DECLARATION(Iwa_MotionBlurCompFx)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Toshihiro Shimizu 890ddd
	TRasterFxPort m_input;
Toshihiro Shimizu 890ddd
	TRasterFxPort m_background;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDoubleParamP m_hardness; /*- フィルムのガンマ値 -*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*-- 左右をぼかすためのパラメータ --*/
Toshihiro Shimizu 890ddd
	TDoubleParamP m_startValue; /*- シャッター開け時のフィルタ値 -*/
Toshihiro Shimizu 890ddd
	/*- シャッター開け時〜現時点までのフィルタ値のガンマ補正値 -*/
Toshihiro Shimizu 890ddd
	TDoubleParamP m_startCurve;
Toshihiro Shimizu 890ddd
	TDoubleParamP m_endValue; /*- シャッター閉じ時のフィルタ値 -*/
Toshihiro Shimizu 890ddd
	/*- 現時点〜シャッター閉じ時までのフィルタ値のガンマ補正値 -*/
Toshihiro Shimizu 890ddd
	TDoubleParamP m_endCurve;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- 残像モードのトグル -*/
Toshihiro Shimizu 890ddd
	TBoolParamP m_zanzoMode;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TIntEnumParamP m_premultiType;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- ソース画像を0〜1に正規化してホストメモリに読み込む
Toshihiro Shimizu 890ddd
		ソース画像がPremultipyされているか、コンボボックスで指定されていない場合は
Toshihiro Shimizu 890ddd
		ここで判定する -*/
Toshihiro Shimizu 890ddd
	template <typename pixel="" raster,="" typename=""></typename>
Toshihiro Shimizu 890ddd
	bool setSourceRaster(const RASTER srcRas,
Toshihiro Shimizu 890ddd
						 float4 *dstMem,
Toshihiro Shimizu 890ddd
						 TDimensionI dim,
Toshihiro Shimizu 890ddd
						 PremultiTypes type = AUTO);
Toshihiro Shimizu 890ddd
	/*- 出力結果をChannel値に変換して格納 -*/
Toshihiro Shimizu 890ddd
	template <typename pixel="" raster,="" typename=""></typename>
Toshihiro Shimizu 890ddd
	void setOutputRaster(float4 *srcMem,
Toshihiro Shimizu 890ddd
						 const RASTER dstRas,
Toshihiro Shimizu 890ddd
						 TDimensionI dim,
Toshihiro Shimizu 890ddd
						 int2 margin);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*-  フィルタをつくり、正規化する -*/
Toshihiro Shimizu 890ddd
	void makeMotionBlurFilter_CPU(float *filter_p,
Toshihiro Shimizu 890ddd
								  TDimensionI &filterDim,
Toshihiro Shimizu 890ddd
								  int marginLeft, int marginBottom,
Toshihiro Shimizu 890ddd
								  float4 *pointsTable,
Toshihiro Shimizu 890ddd
								  int pointAmount,
Toshihiro Shimizu 890ddd
								  float startValue, float startCurve,
Toshihiro Shimizu 890ddd
								  float endValue, float endCurve);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- 残像フィルタをつくり、正規化する -*/
Toshihiro Shimizu 890ddd
	void makeZanzoFilter_CPU(float *filter_p,
Toshihiro Shimizu 890ddd
							 TDimensionI &filterDim,
Toshihiro Shimizu 890ddd
							 int marginLeft, int marginBottom,
Toshihiro Shimizu 890ddd
							 float4 *pointsTable,
Toshihiro Shimizu 890ddd
							 int pointAmount,
Toshihiro Shimizu 890ddd
							 float startValue, float startCurve,
Toshihiro Shimizu 890ddd
							 float endValue, float endCurve);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- RGB値(0〜1)を露光値に変換 -*/
Toshihiro Shimizu 890ddd
	void convertRGBtoExposure_CPU(float4 *in_tile_p,
Toshihiro Shimizu 890ddd
								  TDimensionI &dim, float hardness,
Toshihiro Shimizu 890ddd
								  bool sourceIsPremultiplied);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- 露光値をフィルタリングしてぼかす -*/
Toshihiro Shimizu 890ddd
	void applyBlurFilter_CPU(float4 *in_tile_p,
Toshihiro Shimizu 890ddd
							 float4 *out_tile_p,
Toshihiro Shimizu 890ddd
							 TDimensionI &dim,
Toshihiro Shimizu 890ddd
							 float *filter_p,
Toshihiro Shimizu 890ddd
							 TDimensionI &filterDim,
Toshihiro Shimizu 890ddd
							 int marginLeft, int marginBottom,
Toshihiro Shimizu 890ddd
							 int marginRight, int marginTop,
Toshihiro Shimizu 890ddd
							 TDimensionI &outDim);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- 露光値をdepremultipy→RGB値(0〜1)に戻す→premultiply -*/
Toshihiro Shimizu 890ddd
	void convertExposureToRGB_CPU(float4 *out_tile_p,
Toshihiro Shimizu 890ddd
								  TDimensionI &dim, float hardness);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- 背景があり、前景が動かない場合、単純にOverする -*/
Toshihiro Shimizu 890ddd
	void composeWithNoMotion(TTile &tile,
Toshihiro Shimizu 890ddd
							 double frame,
Toshihiro Shimizu 890ddd
							 const TRenderSettings &settings);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- 背景を露光値にして通常合成 -*/
Toshihiro Shimizu 890ddd
	void composeBackgroundExposure_CPU(float4 *out_tile_p,
Toshihiro Shimizu 890ddd
									   TDimensionI &enlargedDimIn,
Toshihiro Shimizu 890ddd
									   int marginRight, int marginTop,
Toshihiro Shimizu 890ddd
									   TTile &back_tile,
Toshihiro Shimizu 890ddd
									   TDimensionI &dimOut,
Toshihiro Shimizu 890ddd
									   float hardness);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	Iwa_MotionBlurCompFx();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void doCompute(TTile &tile,
Toshihiro Shimizu 890ddd
				   double frame,
Toshihiro Shimizu 890ddd
				   const TRenderSettings &settings);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void doCompute_CPU(TTile &tile,
Toshihiro Shimizu 890ddd
					   double frame,
Toshihiro Shimizu 890ddd
					   const TRenderSettings &settings,
Toshihiro Shimizu 890ddd
					   float4 *pointsTable,
Toshihiro Shimizu 890ddd
					   int pointAmount,
Toshihiro Shimizu 890ddd
					   double hardness,
Toshihiro Shimizu 890ddd
					   double shutterStart, double shutterEnd,
Toshihiro Shimizu 890ddd
					   int traceResolution,
Toshihiro Shimizu 890ddd
					   float startValue, float startCurve,
Toshihiro Shimizu 890ddd
					   float endValue, float endCurve,
Toshihiro Shimizu 890ddd
					   int marginLeft, int marginRight,
Toshihiro Shimizu 890ddd
					   int marginTop, int marginBottom,
Toshihiro Shimizu 890ddd
					   TDimensionI &enlargedDimIn,
Toshihiro Shimizu 890ddd
					   TTile &enlarge_tile,
Toshihiro Shimizu 890ddd
					   TDimensionI &dimOut,
Toshihiro Shimizu 890ddd
					   TDimensionI &filterDim,
Toshihiro Shimizu 890ddd
					   TTile &back_tile);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool doGetBBox(double frame,
Toshihiro Shimizu 890ddd
				   TRectD &bBox,
Toshihiro Shimizu 890ddd
				   const TRenderSettings &info);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool canHandle(const TRenderSettings &info,
Toshihiro Shimizu 890ddd
				   double frame);
Toshihiro Shimizu 890ddd
	/*- 参考にしているオブジェクトが動いている可能性があるので、
Toshihiro Shimizu 890ddd
		エイリアスは毎フレーム変える -*/
Shinya Kitaoka 3bfa54
	std::string getAlias(double frame, const TRenderSettings &info) const;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif