tahoma2d/toonz/sources/stdfx/iwa_particles.h
2016-06-15 15:43:10 +09:00

294 lines
8.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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