#pragma once //------------------------------------------------------------------ // Iwa_Particles_Engine for Marnie // based on Particles_Engine by Digital Video //------------------------------------------------------------------ #ifndef IWA_PARTICLESENGINE_H #define IWA_PARTICLESENGINE_H #include "tlevel.h" #include "iwa_particles.h" #include "iwa_particlesfx.h" struct float3 { float x, y, z; }; class Iwa_Particle; //-------------------- /* 粒子を規則正しく配する、その位置情報と (剥がれるきっかけとなる)現在のポテンシャルを格納 -*/ struct ParticleOrigin { float pos[2]; float potential; /*- 上を向いているかどうか -*/ bool isUpward; /*- どのテクスチャ素材を使うか -*/ unsigned char level; /*- 何番目のフレームを使うか -*/ unsigned char initSourceFrame; /*- ピクセル位置 -*/ short int pixPos[2]; ParticleOrigin(float x, float y, float _potential, bool _isUpward, unsigned char _level, unsigned char _initSourceFrame, short int pix_x, short int pix_y) { pos[0] = x; pos[1] = y; potential = _potential; isUpward = _isUpward; level = _level; initSourceFrame = _initSourceFrame; pixPos[0] = pix_x; pixPos[1] = pix_y; } }; //-------------------- class Iwa_Particles_Engine { public: Iwa_TiledParticlesFx *m_parent; double m_frame; public: Iwa_Particles_Engine(Iwa_TiledParticlesFx *parent, double frame); ~Iwa_Particles_Engine(){}; // Destructor void scramble_particles(void); void fill_range_struct(struct particles_values &values, struct particles_ranges &ranges); void fill_value_struct(struct particles_values &value, double frame); void roll_particles(TTile *tile, std::map porttiles, const TRenderSettings &ri, std::list &myParticles, struct particles_values &values, float cx, float cy, int frame, int curr_frame, int level_n, bool *random_level, float dpi, std::vector lastframe, int &totalparticles, QList &particleOrigin, int genPartNum); void normalize_values(struct particles_values &values, const TRenderSettings &ri); void render_particles(TTile *tile, std::vector part_ports, const TRenderSettings &ri, TDimension &p_size, TPointD &p_offset, std::map ctrl_ports, std::vector partLevel, float dpi, int curr_frame, int shrink, double startx, double starty, double endx, double endy, std::vector lastframe, unsigned long fxId); void do_render(Iwa_Particle *part, TTile *tile, std::vector part_ports, std::map porttiles, const TRenderSettings &ri, TDimension &p_size, TPointD &p_offset, int lastframe, std::vector partLevel, struct particles_values &values, float opacity_range, int curr_frame, std::map, float> &partScales, TTile *baseImgTile); bool port_is_used(int i, struct particles_values &values); void fill_single_region(std::vector &myregions, TTile *ctrl1, int thres, bool do_source_gradation, QList> &myHistogram, QList &particleOrigins); void fill_subregions(int cont_index, std::vector> &myregions, TTile *ctrl1, int thres); void normalize_array(std::vector> &myregions, TPointD pos, int lx, int ly, int regioncounter, std::vector &myarray, std::vector &lista, std::vector &listb, std::vector & final); void fill_array(TTile *ctrl1, int ®ioncount, std::vector &myarray, std::vector &lista, std::vector &listb, int thres); /*- 敷き詰めのため。まだ出発していない粒子情報を初期化 -*/ void initParticleOrigins(TRectD &outTileBBox, QList &particleOrigins, const double frame, const TAffine affine, struct particles_values &values, int level_n, std::vector &lastframe, double pixelMargin); /*- Particle::create_Animationと同じ。粒子発生前に あらかじめ計算してparticesOriginに持たせるため -*/ unsigned char getInitSourceFrame(const particles_values &values, int first, int last); /*- ここで、出発した粒子の分、穴を開けた背景を描く -*/ void renderBackground(TTile *tile, QList &origins, std::vector part_ports, const TRenderSettings &ri, std::vector partLevel, std::map, float> &partScales, TTile *baseImgTile); }; #endif