Shinya Kitaoka 810553
#pragma once
Shinya Kitaoka 810553
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
// Iwa_Particle for Marnie
Toshihiro Shimizu 890ddd
// based on ParticlesFx by Digital Video
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef IWA_PARTICLES_H
Toshihiro Shimizu 890ddd
#define IWA_PARTICLES_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tsmartpointer.h"
Toshihiro Shimizu 890ddd
#include "tspectrum.h"
Toshihiro Shimizu 890ddd
#include "trandom.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "iwa_particlesengine.h"
Toshihiro Shimizu 890ddd
#include <QList>
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
struct particles_values {
Toshihiro Shimizu 890ddd
	int source_ctrl_val;
Toshihiro Shimizu 890ddd
	int bright_thres_val;
Toshihiro Shimizu 890ddd
	bool multi_source_val;
Toshihiro Shimizu 890ddd
	double x_pos_val;
Toshihiro Shimizu 890ddd
	double y_pos_val;
Toshihiro Shimizu 890ddd
	int unit_val;
Toshihiro Shimizu 890ddd
	double length_val;
Toshihiro Shimizu 890ddd
	double height_val;
Toshihiro Shimizu 890ddd
	double maxnum_val;
Toshihiro Shimizu 890ddd
	DoublePair lifetime_val;
Toshihiro Shimizu 890ddd
	int lifetime_ctrl_val;
Toshihiro Shimizu 890ddd
	int column_lifetime_val;
Toshihiro Shimizu 890ddd
	int startpos_val;
Toshihiro Shimizu 890ddd
	int randseed_val;
Toshihiro Shimizu 890ddd
	double gravity_val;
Toshihiro Shimizu 890ddd
	double g_angle_val;
Toshihiro Shimizu 890ddd
	int gravity_ctrl_val;
Toshihiro Shimizu 890ddd
	double friction_val;
Toshihiro Shimizu 890ddd
	int friction_ctrl_val;
Toshihiro Shimizu 890ddd
	double windint_val;
Toshihiro Shimizu 890ddd
	double windangle_val;
Toshihiro Shimizu 890ddd
	int swingmode_val;
Toshihiro Shimizu 890ddd
	DoublePair randomx_val;
Toshihiro Shimizu 890ddd
	DoublePair randomy_val;
Toshihiro Shimizu 890ddd
	int randomx_ctrl_val;
Toshihiro Shimizu 890ddd
	int randomy_ctrl_val;
Toshihiro Shimizu 890ddd
	DoublePair swing_val;
Toshihiro Shimizu 890ddd
	DoublePair speed_val;
Toshihiro Shimizu 890ddd
	int speed_ctrl_val;
Toshihiro Shimizu 890ddd
	DoublePair speeda_val;
Toshihiro Shimizu 890ddd
	int speeda_ctrl_val;
Toshihiro Shimizu 890ddd
	bool speeda_use_gradient_val;
Toshihiro Shimizu 890ddd
	bool speedscale_val;
Toshihiro Shimizu 890ddd
	char *levelname_val;
Toshihiro Shimizu 890ddd
	int toplayer_val;
Toshihiro Shimizu 890ddd
	DoublePair mass_val;
Toshihiro Shimizu 890ddd
	DoublePair scale_val;
Toshihiro Shimizu 890ddd
	int scale_ctrl_val;
Toshihiro Shimizu 890ddd
	bool scale_ctrl_all_val;
Toshihiro Shimizu 890ddd
	DoublePair rot_val;
Toshihiro Shimizu 890ddd
	int rot_ctrl_val;
Toshihiro Shimizu 890ddd
	DoublePair trail_val;
Toshihiro Shimizu 890ddd
	double trailstep_val;
Toshihiro Shimizu 890ddd
	int rotswingmode_val;
Toshihiro Shimizu 890ddd
	double rotspeed_val;
Toshihiro Shimizu 890ddd
	DoublePair rotsca_val;
Toshihiro Shimizu 890ddd
	DoublePair rotswing_val;
Toshihiro Shimizu 890ddd
	bool pathaim_val;
Toshihiro Shimizu 890ddd
	DoublePair opacity_val;
Toshihiro Shimizu 890ddd
	int opacity_ctrl_val;
Toshihiro Shimizu 890ddd
	DoublePair trailopacity_val;
Toshihiro Shimizu 890ddd
	double mblur_val;
Toshihiro Shimizu 890ddd
	DoublePair scalestep_val;
Toshihiro Shimizu 890ddd
	int scalestep_ctrl_val;
Toshihiro Shimizu 890ddd
	double fadein_val;
Toshihiro Shimizu 890ddd
	double fadeout_val;
Toshihiro Shimizu 890ddd
	int animation_val;
Toshihiro Shimizu 890ddd
	int step_val;
Toshihiro Shimizu 890ddd
	TSpectrum gencol_val;
Toshihiro Shimizu 890ddd
	int gencol_ctrl_val;
Toshihiro Shimizu 890ddd
	double gencol_spread_val;
Toshihiro Shimizu 890ddd
	double genfadecol_val;
Toshihiro Shimizu 890ddd
	TSpectrum fincol_val;
Toshihiro Shimizu 890ddd
	int fincol_ctrl_val;
Toshihiro Shimizu 890ddd
	double fincol_spread_val;
Toshihiro Shimizu 890ddd
	double finrangecol_val;
Toshihiro Shimizu 890ddd
	double finfadecol_val;
Toshihiro Shimizu 890ddd
	TSpectrum foutcol_val;
Toshihiro Shimizu 890ddd
	int foutcol_ctrl_val;
Toshihiro Shimizu 890ddd
	double foutcol_spread_val;
Toshihiro Shimizu 890ddd
	double foutrangecol_val;
Toshihiro Shimizu 890ddd
	double foutfadecol_val;
Toshihiro Shimizu 890ddd
	TRandom *random_val;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool source_gradation_val;
Toshihiro Shimizu 890ddd
	bool reset_random_for_every_frame_val;
Toshihiro Shimizu 890ddd
	bool pick_color_for_every_frame_val;
Toshihiro Shimizu 890ddd
	bool perspective_distribution_val;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- 以下、このFxのために追加したパラメータ -*/
Toshihiro Shimizu 890ddd
	/*-  計算モード (背景+粒子/粒子/背景/照明された粒子)-*/
Toshihiro Shimizu 890ddd
	int iw_rendermode_val;
Toshihiro Shimizu 890ddd
	/*- 粒子に貼られる絵の素材 -*/
Toshihiro Shimizu 890ddd
	int base_ctrl_val;
Toshihiro Shimizu 890ddd
	/*- カールノイズ的な動きを与える -*/
Toshihiro Shimizu 890ddd
	double curl_val;
Toshihiro Shimizu 890ddd
	int curl_ctrl_1_val;
Toshihiro Shimizu 890ddd
	int curl_ctrl_2_val;
Toshihiro Shimizu 890ddd
	/*- 粒子敷き詰め。粒子を正三角形で敷き詰めたときの、
Toshihiro Shimizu 890ddd
		正三角形の一辺の長さをインチで指定する -*/
Toshihiro Shimizu 890ddd
	double iw_triangleSize;
Toshihiro Shimizu 890ddd
	/*- ひらひら回転 -*/
Toshihiro Shimizu 890ddd
	int flap_ctrl_val;
Toshihiro Shimizu 890ddd
	double iw_flap_velocity_val;
Toshihiro Shimizu 890ddd
	double iw_flap_dir_sensitivity_val;
Toshihiro Shimizu 890ddd
	/*- ひらひら粒子に照明を当てる。normalize_values()内で Degree → Radian 化する -*/
Toshihiro Shimizu 890ddd
	double iw_light_theta_val;
Toshihiro Shimizu 890ddd
	double iw_light_phi_val;
Toshihiro Shimizu 890ddd
	/*- 読み込みマージン -*/
Toshihiro Shimizu 890ddd
	double margin_val;
Toshihiro Shimizu 890ddd
	/*- 重力を徐々に与えるためのフレーム長 -*/
Toshihiro Shimizu 890ddd
	int iw_gravityBufferFrame_val;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
struct particles_ranges {
Toshihiro Shimizu 890ddd
	float swing_range;
Toshihiro Shimizu 890ddd
	float randomx_range;
Toshihiro Shimizu 890ddd
	float randomy_range;
Toshihiro Shimizu 890ddd
	float rot_range;
Toshihiro Shimizu 890ddd
	float rotswing_range;
Toshihiro Shimizu 890ddd
	float rotsca_range;
Toshihiro Shimizu 890ddd
	float lifetime_range;
Toshihiro Shimizu 890ddd
	float speed_range;
Toshihiro Shimizu 890ddd
	float speeda_range;
Toshihiro Shimizu 890ddd
	float mass_range;
Toshihiro Shimizu 890ddd
	float scale_range;
Toshihiro Shimizu 890ddd
	float scalestep_range;
Toshihiro Shimizu 890ddd
	int trail_range;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
struct pos_dummy {
Toshihiro Shimizu 890ddd
	float x, y, a;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef struct
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	TPixel32 col;
Toshihiro Shimizu 890ddd
	int rangecol;
Toshihiro Shimizu 890ddd
	double fadecol;
Toshihiro Shimizu 890ddd
} coldata;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class Iwa_Particle
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	double x;
Toshihiro Shimizu 890ddd
	float y;
Toshihiro Shimizu 890ddd
	float oldx;
Toshihiro Shimizu 890ddd
	float oldy;
Toshihiro Shimizu 890ddd
	float vx;
Toshihiro Shimizu 890ddd
	float vy;
Toshihiro Shimizu 890ddd
	float mass;
Toshihiro Shimizu 890ddd
	float scale;
Toshihiro Shimizu 890ddd
	float angle;
Toshihiro Shimizu 890ddd
	float smswingx;
Toshihiro Shimizu 890ddd
	float smswingy;
Toshihiro Shimizu 890ddd
	float smswinga;
Toshihiro Shimizu 890ddd
	int smperiodx;
Toshihiro Shimizu 890ddd
	int smperiody;
Toshihiro Shimizu 890ddd
	int smperioda;
Toshihiro Shimizu 890ddd
	int lifetime;	/*- 現在の残り寿命 -*/
Toshihiro Shimizu 890ddd
	int genlifetime; /*- 発生時の寿命 -*/
Toshihiro Shimizu 890ddd
	int level;
Toshihiro Shimizu 890ddd
	int frame;
Toshihiro Shimizu 890ddd
	int signx;
Toshihiro Shimizu 890ddd
	int trail;
Toshihiro Shimizu 890ddd
	coldata gencol;
Toshihiro Shimizu 890ddd
	coldata fincol;
Toshihiro Shimizu 890ddd
	coldata foutcol;
Toshihiro Shimizu 890ddd
	int changesignx;
Toshihiro Shimizu 890ddd
	int signy;
Toshihiro Shimizu 890ddd
	int changesigny;
Toshihiro Shimizu 890ddd
	int signa;
Toshihiro Shimizu 890ddd
	int changesigna;
Toshihiro Shimizu 890ddd
	bool animswing;
Toshihiro Shimizu 890ddd
	TRandom random;
Toshihiro Shimizu 890ddd
	int seed;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	float initial_x;
Toshihiro Shimizu 890ddd
	float initial_y;
Toshihiro Shimizu 890ddd
	float initial_angle;
Toshihiro Shimizu 890ddd
	float initial_scale;
Toshihiro Shimizu 890ddd
	float curlx;
Toshihiro Shimizu 890ddd
	float curly;
Toshihiro Shimizu 890ddd
	float curlz;
Toshihiro Shimizu 890ddd
	/*- ひらひら動かす回転角(Degree)-*/
Toshihiro Shimizu 890ddd
	float flap_theta;
Toshihiro Shimizu 890ddd
	float flap_phi;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	Iwa_Particle(int lifetime,
Toshihiro Shimizu 890ddd
				 int seed,
Shinya Kitaoka 3bfa54
				 const std::map<int, TTile *> porttiles,
Toshihiro Shimizu 890ddd
				 const particles_values &values,
Toshihiro Shimizu 890ddd
				 const particles_ranges &ranges,
Toshihiro Shimizu 890ddd
				 int howmany,
Toshihiro Shimizu 890ddd
				 int first,
Toshihiro Shimizu 890ddd
				 int level,
Toshihiro Shimizu 890ddd
				 int last,
Toshihiro Shimizu 890ddd
				 float posx, float posy, /*- 座標を指定 -*/
Toshihiro Shimizu 890ddd
				 bool isUpward,			 /*-  初期向き -*/
Toshihiro Shimizu 890ddd
				 int initSourceFrame);
Toshihiro Shimizu 890ddd
	//Constructor
Toshihiro Shimizu 890ddd
	~Iwa_Particle() {}
Toshihiro Shimizu 890ddd
	//Destructor
Toshihiro Shimizu 890ddd
	void create_Animation(const particles_values &values, int first, int last);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int check_Swing(const particles_values &values);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void create_Swing(const particles_values &values,
Toshihiro Shimizu 890ddd
					  const particles_ranges &ranges,
Toshihiro Shimizu 890ddd
					  double randomxreference, double randomyreference);
Toshihiro Shimizu 890ddd
	void create_Colors(const particles_values &values,
Shinya Kitaoka 3bfa54
					   const particles_ranges &ranges, std::map<int, TTile *> porttiles);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	void move(const std::map<int, TTile *> porttiles, const particles_values &values, const particles_ranges &ranges, float windx,
Toshihiro Shimizu 890ddd
			  float windy, float xgravity, float ygravity, float dpi, int lastframe);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void spread_color(TPixel32 &color, double range);
Toshihiro Shimizu 890ddd
	void update_Animation(const particles_values &values, int first, int last, int keep);
Toshihiro Shimizu 890ddd
	void update_Swing(const particles_values &values,
Toshihiro Shimizu 890ddd
					  const particles_ranges &ranges,
Toshihiro Shimizu 890ddd
					  struct pos_dummy &dummy,
Toshihiro Shimizu 890ddd
					  double randomxreference, double randomyreference);
Toshihiro Shimizu 890ddd
	void update_Scale(const particles_values &values,
Toshihiro Shimizu 890ddd
					  const particles_ranges &ranges,
Toshihiro Shimizu 890ddd
					  double scalereference, double scalestepreference);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double set_Opacity(std::map<int, TTile *> porttiles,
Toshihiro Shimizu 890ddd
					   const particles_values &values,
Toshihiro Shimizu 890ddd
					   float opacity_range, double dist_frame);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void modify_colors(TPixel32 &color, double &intensity);
Toshihiro Shimizu 890ddd
	void modify_colors_and_opacity(const particles_values &values,
Toshihiro Shimizu 890ddd
								   float curr_opacity, int dist_frame, TRaster32P raster);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool canHandle(const TRenderSettings &info, double frame) { return false; }
Toshihiro Shimizu 890ddd
	void get_image_reference(TTile *ctrl1, const particles_values &values,
Toshihiro Shimizu 890ddd
							 float &imagereference, int type);
Toshihiro Shimizu 890ddd
	void get_image_reference(TTile *ctrl1, const particles_values &values,
Toshihiro Shimizu 890ddd
							 TPixel32 &color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- ベクタ長を返す -*/
Toshihiro Shimizu 890ddd
	float get_image_gravity(TTile *ctrl1, const particles_values &values,
Toshihiro Shimizu 890ddd
							float &gx, float &gy);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void get_base_image_texture(TTile *ctrl1,
Toshihiro Shimizu 890ddd
								const particles_values &values,
Toshihiro Shimizu 890ddd
								TRasterP texRaster,
Toshihiro Shimizu 890ddd
								const TRectD &texBBox,
Toshihiro Shimizu 890ddd
								const TRenderSettings &ri);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void get_base_image_color(TTile *ctrl1,
Toshihiro Shimizu 890ddd
							  const particles_values &values,
Toshihiro Shimizu 890ddd
							  TRasterP texRaster,
Toshihiro Shimizu 890ddd
							  const TRectD &texBBox,
Toshihiro Shimizu 890ddd
							  const TRenderSettings &ri);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- Control圏内ならtrueを返す -*/
Toshihiro Shimizu 890ddd
	bool get_image_curl(TTile *ctrl1,
Toshihiro Shimizu 890ddd
						const particles_values &values,
Toshihiro Shimizu 890ddd
						float &cx, float &cy);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- 照明モードのとき、その明るさを色に格納 -*/
Toshihiro Shimizu 890ddd
	void set_illuminated_colors(float illuminant, TRasterP texRaster);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class Iwa_ComparebySize
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	bool operator()(const Iwa_Particle &f1,
Toshihiro Shimizu 890ddd
					const Iwa_Particle &f2)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if ((f1.scale - f2.scale) > 0)
Toshihiro Shimizu 890ddd
			return 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class Iwa_ComparebyLifetime
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	bool operator()(const Iwa_Particle &f1,
Toshihiro Shimizu 890ddd
					const Iwa_Particle &f2)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if ((f1.lifetime - f1.genlifetime - f2.lifetime + f2.genlifetime) > 0)
Toshihiro Shimizu 890ddd
			return 1;
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif