#pragma once
#ifndef PARTICLES_H
#define PARTICLES_H
#include "tsmartpointer.h"
#include "tspectrum.h"
#include "trandom.h"
//------------------------------------------------------------------------------
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;
//double lifetimemin_val;
//double lifetimemax_val;
int startpos_val;
int randseed_val;
double gravity_val;
double g_angle_val;
int gravity_ctrl_val;
// int gravity_radius_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;
};
//------------------------------------------------------------------------------
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 Particle
{
public:
double x;
double y;
double oldx;
double oldy;
double vx; /*sono le velox iniziali*/
double vy; /*sono le velox iniziali*/
double mass;
double scale; /*potrebbe diventare la z*/
double angle;
double smswingx;
double smswingy;
double 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;
public:
Particle(int lifetime, int seed, const std::map<int, TTile *> porttiles, const particles_values &values, const particles_ranges &ranges, std::vector<std::vector<TPointD>> &myregions, int howmany, int first, int level, int last,
std::vector<std::vector<int>> &myHistogram, std::vector<float> &myWeight);
//Constructor
~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,
double &imagereference, int type);
void get_image_reference(TTile *ctrl1, const particles_values &values,
TPixel32 &color);
void get_image_gravity(TTile *ctrl1, const particles_values &values,
float &gx, float &gy);
};
class ComparebySize
{
public:
bool operator()(const Particle &f1,
const Particle &f2)
{
if ((f1.scale - f2.scale) > 0)
return 1;
return 0;
}
};
class ComparebyLifetime
{
public:
bool operator()(const Particle &f1,
const Particle &f2)
{
if ((f1.lifetime - f1.genlifetime - f2.lifetime + f2.genlifetime) > 0)
return 1;
return 0;
}
};
#endif