|
@@ -503,19 +503,6 @@ void Particles2D::_notification(int p_what) {
|
|
|
if (!local_space)
|
|
if (!local_space)
|
|
|
invxform=get_global_transform().affine_inverse();
|
|
invxform=get_global_transform().affine_inverse();
|
|
|
|
|
|
|
|
- int col_count=0;
|
|
|
|
|
- float last=-1;
|
|
|
|
|
- ColorPhase cphase[MAX_COLOR_PHASES];
|
|
|
|
|
-
|
|
|
|
|
- for(int i=0;i<color_phase_count;i++) {
|
|
|
|
|
-
|
|
|
|
|
- if (color_phases[i].pos<=last)
|
|
|
|
|
- break;
|
|
|
|
|
- cphase[i]=color_phases[i];
|
|
|
|
|
- col_count++;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
int start_particle = (int)(time * (float)particle_count / lifetime);
|
|
int start_particle = (int)(time * (float)particle_count / lifetime);
|
|
|
|
|
|
|
|
for (int id=0;id<particle_count;++id) {
|
|
for (int id=0;id<particle_count;++id) {
|
|
@@ -537,32 +524,42 @@ void Particles2D::_notification(int p_what) {
|
|
|
|
|
|
|
|
uint32_t rand_seed=p.seed*(i+1);
|
|
uint32_t rand_seed=p.seed*(i+1);
|
|
|
|
|
|
|
|
|
|
+ Color color;
|
|
|
|
|
|
|
|
- int cpos=0;
|
|
|
|
|
|
|
+ if(color_ramp.is_valid())
|
|
|
|
|
+ {
|
|
|
|
|
+ Vector<ColorRamp::Point>& color_points = color_ramp->get_points();
|
|
|
|
|
|
|
|
- while(cpos<col_count) {
|
|
|
|
|
|
|
+ int cpos=0;
|
|
|
|
|
|
|
|
- if (cphase[cpos].pos > ptime)
|
|
|
|
|
- break;
|
|
|
|
|
- cpos++;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ while(cpos<color_points.size()) {
|
|
|
|
|
|
|
|
- cpos--;
|
|
|
|
|
|
|
+ if (color_points[cpos].offset > ptime)
|
|
|
|
|
+ break;
|
|
|
|
|
+ cpos++;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- Color color;
|
|
|
|
|
- //could be faster..
|
|
|
|
|
- if (cpos==-1)
|
|
|
|
|
- color=Color(1,1,1,1);
|
|
|
|
|
- else {
|
|
|
|
|
- if (cpos==col_count-1)
|
|
|
|
|
- color=cphase[cpos].color;
|
|
|
|
|
- else {
|
|
|
|
|
- float diff = (cphase[cpos+1].pos-cphase[cpos].pos);
|
|
|
|
|
- if (diff>0)
|
|
|
|
|
- color=cphase[cpos].color.linear_interpolate(cphase[cpos+1].color, (ptime - cphase[cpos].pos) / diff );
|
|
|
|
|
|
|
+ cpos--;
|
|
|
|
|
+ //could be faster..
|
|
|
|
|
+ if (cpos==-1)
|
|
|
|
|
+ if(color_points.size())
|
|
|
|
|
+ color=color_points[0].color;//Extend color to the beginning
|
|
|
else
|
|
else
|
|
|
- color=cphase[cpos+1].color;
|
|
|
|
|
|
|
+ color=Color(1,1,1,1);//If no points just use white.
|
|
|
|
|
+ else {
|
|
|
|
|
+ if (cpos==color_points.size()-1)
|
|
|
|
|
+ color=color_points[cpos].color;
|
|
|
|
|
+ else {
|
|
|
|
|
+ float diff = (color_points[cpos+1].offset-color_points[cpos].offset);
|
|
|
|
|
+ if (diff>0)
|
|
|
|
|
+ color=color_points[cpos].color.linear_interpolate(color_points[cpos+1].color, (ptime - color_points[cpos].offset) / diff );
|
|
|
|
|
+ else
|
|
|
|
|
+ color=color_points[cpos+1].color;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+ } else
|
|
|
|
|
+ {
|
|
|
|
|
+ color = default_color;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -813,6 +810,27 @@ Ref<Texture> Particles2D::get_texture() const {
|
|
|
return texture;
|
|
return texture;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void Particles2D::set_color(const Color& p_color) {
|
|
|
|
|
+
|
|
|
|
|
+ default_color = p_color;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+Color Particles2D::get_color() const {
|
|
|
|
|
+
|
|
|
|
|
+ return default_color;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+void Particles2D::set_color_ramp(const Ref<ColorRamp>& p_color_ramp) {
|
|
|
|
|
+
|
|
|
|
|
+ color_ramp=p_color_ramp;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+Ref<ColorRamp> Particles2D::get_color_ramp() const {
|
|
|
|
|
+
|
|
|
|
|
+ return color_ramp;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
void Particles2D::set_emissor_offset(const Point2& p_offset) {
|
|
void Particles2D::set_emissor_offset(const Point2& p_offset) {
|
|
|
|
|
|
|
|
emissor_offset=p_offset;
|
|
emissor_offset=p_offset;
|
|
@@ -834,40 +852,76 @@ bool Particles2D::is_using_local_space() const {
|
|
|
return local_space;
|
|
return local_space;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
+//Deprecated. Converts color phases to color ramp
|
|
|
void Particles2D::set_color_phases(int p_phases) {
|
|
void Particles2D::set_color_phases(int p_phases) {
|
|
|
|
|
|
|
|
- ERR_FAIL_INDEX(p_phases,MAX_COLOR_PHASES+1);
|
|
|
|
|
- color_phase_count=p_phases;
|
|
|
|
|
|
|
+ //Create color ramp if we have 2 or more phases.
|
|
|
|
|
+ //Otherwise first phase phase will be assigned to default color.
|
|
|
|
|
+ if(p_phases > 1 && color_ramp.is_null())
|
|
|
|
|
+ {
|
|
|
|
|
+ color_ramp = Ref<ColorRamp>(memnew (ColorRamp()));
|
|
|
|
|
+ }
|
|
|
|
|
+ if(color_ramp.is_valid())
|
|
|
|
|
+ {
|
|
|
|
|
+ color_ramp->get_points().resize(p_phases);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+//Deprecated.
|
|
|
int Particles2D::get_color_phases() const {
|
|
int Particles2D::get_color_phases() const {
|
|
|
|
|
|
|
|
- return color_phase_count;
|
|
|
|
|
|
|
+ if(color_ramp.is_valid())
|
|
|
|
|
+ {
|
|
|
|
|
+ return color_ramp->get_points_count();
|
|
|
|
|
+ }
|
|
|
|
|
+ return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+//Deprecated. Converts color phases to color ramp
|
|
|
void Particles2D::set_color_phase_color(int p_phase,const Color& p_color) {
|
|
void Particles2D::set_color_phase_color(int p_phase,const Color& p_color) {
|
|
|
|
|
|
|
|
ERR_FAIL_INDEX(p_phase,MAX_COLOR_PHASES);
|
|
ERR_FAIL_INDEX(p_phase,MAX_COLOR_PHASES);
|
|
|
- color_phases[p_phase].color=p_color;
|
|
|
|
|
-
|
|
|
|
|
|
|
+ if(color_ramp.is_valid())
|
|
|
|
|
+ {
|
|
|
|
|
+ if(color_ramp->get_points_count() > p_phase)
|
|
|
|
|
+ color_ramp->set_color(p_phase, p_color);
|
|
|
|
|
+ } else
|
|
|
|
|
+ {
|
|
|
|
|
+ if(p_phase == 0)
|
|
|
|
|
+ default_color = p_color;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+//Deprecated.
|
|
|
Color Particles2D::get_color_phase_color(int p_phase) const {
|
|
Color Particles2D::get_color_phase_color(int p_phase) const {
|
|
|
|
|
|
|
|
ERR_FAIL_INDEX_V(p_phase,MAX_COLOR_PHASES,Color());
|
|
ERR_FAIL_INDEX_V(p_phase,MAX_COLOR_PHASES,Color());
|
|
|
- return color_phases[p_phase].color;
|
|
|
|
|
|
|
+ if(color_ramp.is_valid())
|
|
|
|
|
+ {
|
|
|
|
|
+ return color_ramp->get_color(p_phase);
|
|
|
|
|
+ }
|
|
|
|
|
+ return Color(0,0,0,1);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+//Deprecated. Converts color phases to color ramp
|
|
|
void Particles2D::set_color_phase_pos(int p_phase,float p_pos) {
|
|
void Particles2D::set_color_phase_pos(int p_phase,float p_pos) {
|
|
|
ERR_FAIL_INDEX(p_phase,MAX_COLOR_PHASES);
|
|
ERR_FAIL_INDEX(p_phase,MAX_COLOR_PHASES);
|
|
|
ERR_FAIL_COND(p_pos<0.0 || p_pos>1.0);
|
|
ERR_FAIL_COND(p_pos<0.0 || p_pos>1.0);
|
|
|
- color_phases[p_phase].pos=p_pos;
|
|
|
|
|
-
|
|
|
|
|
|
|
+ if(color_ramp.is_valid() && color_ramp->get_points_count() > p_phase)
|
|
|
|
|
+ {
|
|
|
|
|
+ return color_ramp->set_offset(p_phase, p_pos);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+//Deprecated.
|
|
|
float Particles2D::get_color_phase_pos(int p_phase) const {
|
|
float Particles2D::get_color_phase_pos(int p_phase) const {
|
|
|
|
|
|
|
|
ERR_FAIL_INDEX_V(p_phase,MAX_COLOR_PHASES,0);
|
|
ERR_FAIL_INDEX_V(p_phase,MAX_COLOR_PHASES,0);
|
|
|
- return color_phases[p_phase].pos;
|
|
|
|
|
|
|
+ if(color_ramp.is_valid())
|
|
|
|
|
+ {
|
|
|
|
|
+ return color_ramp->get_offset(p_phase);
|
|
|
|
|
+ }
|
|
|
|
|
+ return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void Particles2D::set_emission_half_extents(const Vector2& p_extents) {
|
|
void Particles2D::set_emission_half_extents(const Vector2& p_extents) {
|
|
@@ -997,6 +1051,12 @@ void Particles2D::_bind_methods() {
|
|
|
ObjectTypeDB::bind_method(_MD("set_texture:Texture","texture"),&Particles2D::set_texture);
|
|
ObjectTypeDB::bind_method(_MD("set_texture:Texture","texture"),&Particles2D::set_texture);
|
|
|
ObjectTypeDB::bind_method(_MD("get_texture:Texture"),&Particles2D::get_texture);
|
|
ObjectTypeDB::bind_method(_MD("get_texture:Texture"),&Particles2D::get_texture);
|
|
|
|
|
|
|
|
|
|
+ ObjectTypeDB::bind_method(_MD("set_color","color"),&Particles2D::set_color);
|
|
|
|
|
+ ObjectTypeDB::bind_method(_MD("get_color"),&Particles2D::get_color);
|
|
|
|
|
+
|
|
|
|
|
+ ObjectTypeDB::bind_method(_MD("set_color_ramp:ColorRamp","color_ramp"),&Particles2D::set_color_ramp);
|
|
|
|
|
+ ObjectTypeDB::bind_method(_MD("get_color_ramp:ColorRamp"),&Particles2D::get_color_ramp);
|
|
|
|
|
+
|
|
|
ObjectTypeDB::bind_method(_MD("set_emissor_offset","offset"),&Particles2D::set_emissor_offset);
|
|
ObjectTypeDB::bind_method(_MD("set_emissor_offset","offset"),&Particles2D::set_emissor_offset);
|
|
|
ObjectTypeDB::bind_method(_MD("get_emissor_offset"),&Particles2D::get_emissor_offset);
|
|
ObjectTypeDB::bind_method(_MD("get_emissor_offset"),&Particles2D::get_emissor_offset);
|
|
|
|
|
|
|
@@ -1055,7 +1115,6 @@ void Particles2D::_bind_methods() {
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::INT,"config/v_frames",PROPERTY_HINT_RANGE,"1,512,1"),_SCS("set_v_frames"),_SCS("get_v_frames"));
|
|
ADD_PROPERTY(PropertyInfo(Variant::INT,"config/v_frames",PROPERTY_HINT_RANGE,"1,512,1"),_SCS("set_v_frames"),_SCS("get_v_frames"));
|
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
for(int i=0;i<PARAM_MAX;i++) {
|
|
for(int i=0;i<PARAM_MAX;i++) {
|
|
|
ADD_PROPERTYI(PropertyInfo(Variant::REAL,_particlesframe_property_names[i],PROPERTY_HINT_RANGE,_particlesframe_property_ranges[i]),_SCS("set_param"),_SCS("get_param"),i);
|
|
ADD_PROPERTYI(PropertyInfo(Variant::REAL,_particlesframe_property_names[i],PROPERTY_HINT_RANGE,_particlesframe_property_ranges[i]),_SCS("set_param"),_SCS("get_param"),i);
|
|
|
}
|
|
}
|
|
@@ -1064,14 +1123,17 @@ void Particles2D::_bind_methods() {
|
|
|
ADD_PROPERTYI(PropertyInfo(Variant::REAL,_particlesframe_property_rnames[i],PROPERTY_HINT_RANGE,"-1,1,0.01"),_SCS("set_randomness"),_SCS("get_randomness"),i);
|
|
ADD_PROPERTYI(PropertyInfo(Variant::REAL,_particlesframe_property_rnames[i],PROPERTY_HINT_RANGE,"-1,1,0.01"),_SCS("set_randomness"),_SCS("get_randomness"),i);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- ADD_PROPERTY( PropertyInfo( Variant::INT, "color_phases/count",PROPERTY_HINT_RANGE,"0,4,1"), _SCS("set_color_phases"), _SCS("get_color_phases"));
|
|
|
|
|
|
|
+ ADD_PROPERTY( PropertyInfo( Variant::INT, "color_phases/count",PROPERTY_HINT_RANGE,"0,4,1", 0), _SCS("set_color_phases"), _SCS("get_color_phases"));
|
|
|
|
|
|
|
|
|
|
+ //Backward compatibility. They will be converted to color ramp
|
|
|
for(int i=0;i<MAX_COLOR_PHASES;i++) {
|
|
for(int i=0;i<MAX_COLOR_PHASES;i++) {
|
|
|
String phase="phase_"+itos(i)+"/";
|
|
String phase="phase_"+itos(i)+"/";
|
|
|
- ADD_PROPERTYI( PropertyInfo( Variant::REAL, phase+"pos", PROPERTY_HINT_RANGE,"0,1,0.01"),_SCS("set_color_phase_pos"),_SCS("get_color_phase_pos"),i );
|
|
|
|
|
- ADD_PROPERTYI( PropertyInfo( Variant::COLOR, phase+"color"),_SCS("set_color_phase_color"),_SCS("get_color_phase_color"),i );
|
|
|
|
|
|
|
+ ADD_PROPERTYI( PropertyInfo( Variant::REAL, phase+"pos", PROPERTY_HINT_RANGE,"0,1,0.01", 0),_SCS("set_color_phase_pos"),_SCS("get_color_phase_pos"),i );
|
|
|
|
|
+ ADD_PROPERTYI( PropertyInfo( Variant::COLOR, phase+"color", PROPERTY_HINT_NONE, "", 0),_SCS("set_color_phase_color"),_SCS("get_color_phase_color"),i );
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::COLOR, "color/color"),_SCS("set_color"),_SCS("get_color"));
|
|
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::OBJECT,"color/color_ramp",PROPERTY_HINT_RESOURCE_TYPE,"ColorRamp"),_SCS("set_color_ramp"),_SCS("get_color_ramp"));
|
|
|
|
|
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2_ARRAY,"emission_points",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR),_SCS("set_emission_points"),_SCS("get_emission_points"));
|
|
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2_ARRAY,"emission_points",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR),_SCS("set_emission_points"),_SCS("get_emission_points"));
|
|
|
|
|
|
|
@@ -1097,8 +1159,6 @@ void Particles2D::_bind_methods() {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
Particles2D::Particles2D() {
|
|
Particles2D::Particles2D() {
|
|
|
|
|
|
|
|
for(int i=0;i<PARAM_MAX;i++) {
|
|
for(int i=0;i<PARAM_MAX;i++) {
|
|
@@ -1118,6 +1178,7 @@ Particles2D::Particles2D() {
|
|
|
set_param(PARAM_FINAL_SIZE,1.0);
|
|
set_param(PARAM_FINAL_SIZE,1.0);
|
|
|
set_param(PARAM_ANIM_SPEED_SCALE,1.0);
|
|
set_param(PARAM_ANIM_SPEED_SCALE,1.0);
|
|
|
|
|
|
|
|
|
|
+ set_color(Color(1,1,1,1));
|
|
|
|
|
|
|
|
time=0;
|
|
time=0;
|
|
|
lifetime=2;
|
|
lifetime=2;
|
|
@@ -1129,17 +1190,6 @@ Particles2D::Particles2D() {
|
|
|
preprocess=0;
|
|
preprocess=0;
|
|
|
time_scale=1.0;
|
|
time_scale=1.0;
|
|
|
|
|
|
|
|
- color_phase_count=1;
|
|
|
|
|
-
|
|
|
|
|
- set_color_phase_pos(0,0.0);
|
|
|
|
|
- set_color_phase_pos(1,1.0);
|
|
|
|
|
- set_color_phase_pos(2,1.0);
|
|
|
|
|
- set_color_phase_pos(3,1.0);
|
|
|
|
|
-
|
|
|
|
|
- set_color_phase_color(0,Color(1,1,1));
|
|
|
|
|
- set_color_phase_color(1,Color(0,0,0));
|
|
|
|
|
- set_color_phase_color(2,Color(0,0,0));
|
|
|
|
|
- set_color_phase_color(3,Color(0,0,0));
|
|
|
|
|
|
|
|
|
|
flip_h=false;
|
|
flip_h=false;
|
|
|
flip_v=false;
|
|
flip_v=false;
|