You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-24 15:26:15 +00:00
particles: add amount property to sub property collision.
This commit is contained in:
@@ -259,6 +259,10 @@
|
|||||||
<member name="spread" type="float" setter="set_spread" getter="get_spread" default="45.0">
|
<member name="spread" type="float" setter="set_spread" getter="get_spread" default="45.0">
|
||||||
Each particle's initial direction range from [code]+spread[/code] to [code]-spread[/code] degrees.
|
Each particle's initial direction range from [code]+spread[/code] to [code]-spread[/code] degrees.
|
||||||
</member>
|
</member>
|
||||||
|
<member name="sub_emitter_amount_at_collision" type="int" setter="set_sub_emitter_amount_at_collision" getter="get_sub_emitter_amount_at_collision">
|
||||||
|
Sub particle amount on collision.
|
||||||
|
Maximum amount set in the sub particles emitter.
|
||||||
|
</member>
|
||||||
<member name="sub_emitter_amount_at_end" type="int" setter="set_sub_emitter_amount_at_end" getter="get_sub_emitter_amount_at_end">
|
<member name="sub_emitter_amount_at_end" type="int" setter="set_sub_emitter_amount_at_end" getter="get_sub_emitter_amount_at_end">
|
||||||
</member>
|
</member>
|
||||||
<member name="sub_emitter_frequency" type="float" setter="set_sub_emitter_frequency" getter="get_sub_emitter_frequency">
|
<member name="sub_emitter_frequency" type="float" setter="set_sub_emitter_frequency" getter="get_sub_emitter_frequency">
|
||||||
|
|||||||
@@ -115,6 +115,7 @@ void ParticleProcessMaterial::init_shaders() {
|
|||||||
|
|
||||||
shader_names->sub_emitter_frequency = "sub_emitter_frequency";
|
shader_names->sub_emitter_frequency = "sub_emitter_frequency";
|
||||||
shader_names->sub_emitter_amount_at_end = "sub_emitter_amount_at_end";
|
shader_names->sub_emitter_amount_at_end = "sub_emitter_amount_at_end";
|
||||||
|
shader_names->sub_emitter_amount_at_collision = "sub_emitter_amount_at_collision";
|
||||||
shader_names->sub_emitter_keep_velocity = "sub_emitter_keep_velocity";
|
shader_names->sub_emitter_keep_velocity = "sub_emitter_keep_velocity";
|
||||||
|
|
||||||
shader_names->collision_friction = "collision_friction";
|
shader_names->collision_friction = "collision_friction";
|
||||||
@@ -235,6 +236,9 @@ void ParticleProcessMaterial::_update_shader() {
|
|||||||
if (sub_emitter_mode == SUB_EMITTER_AT_END) {
|
if (sub_emitter_mode == SUB_EMITTER_AT_END) {
|
||||||
code += "uniform int sub_emitter_amount_at_end;\n";
|
code += "uniform int sub_emitter_amount_at_end;\n";
|
||||||
}
|
}
|
||||||
|
if (sub_emitter_mode == SUB_EMITTER_AT_COLLISION) {
|
||||||
|
code += "uniform int sub_emitter_amount_at_collision;\n";
|
||||||
|
}
|
||||||
code += "uniform bool sub_emitter_keep_velocity;\n";
|
code += "uniform bool sub_emitter_keep_velocity;\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -874,7 +878,7 @@ void ParticleProcessMaterial::_update_shader() {
|
|||||||
code += " if (DELTA >= interval_rem) emit_count = 1;\n";
|
code += " if (DELTA >= interval_rem) emit_count = 1;\n";
|
||||||
} break;
|
} break;
|
||||||
case SUB_EMITTER_AT_COLLISION: {
|
case SUB_EMITTER_AT_COLLISION: {
|
||||||
code += " if (COLLIDED) emit_count = 1;\n";
|
code += " if (COLLIDED) emit_count = sub_emitter_amount_at_collision;\n";
|
||||||
} break;
|
} break;
|
||||||
case SUB_EMITTER_AT_END: {
|
case SUB_EMITTER_AT_END: {
|
||||||
code += " float unit_delta = DELTA/LIFETIME;\n";
|
code += " float unit_delta = DELTA/LIFETIME;\n";
|
||||||
@@ -1433,6 +1437,10 @@ void ParticleProcessMaterial::_validate_property(PropertyInfo &p_property) const
|
|||||||
p_property.usage = PROPERTY_USAGE_NONE;
|
p_property.usage = PROPERTY_USAGE_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p_property.name == "sub_emitter_amount_at_collision" && sub_emitter_mode != SUB_EMITTER_AT_COLLISION) {
|
||||||
|
p_property.usage = PROPERTY_USAGE_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
if (p_property.name.begins_with("orbit_") && !particle_flags[PARTICLE_FLAG_DISABLE_Z]) {
|
if (p_property.name.begins_with("orbit_") && !particle_flags[PARTICLE_FLAG_DISABLE_Z]) {
|
||||||
p_property.usage = PROPERTY_USAGE_NONE;
|
p_property.usage = PROPERTY_USAGE_NONE;
|
||||||
}
|
}
|
||||||
@@ -1488,6 +1496,15 @@ int ParticleProcessMaterial::get_sub_emitter_amount_at_end() const {
|
|||||||
return sub_emitter_amount_at_end;
|
return sub_emitter_amount_at_end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ParticleProcessMaterial::set_sub_emitter_amount_at_collision(int p_amount) {
|
||||||
|
sub_emitter_amount_at_collision = p_amount;
|
||||||
|
RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->sub_emitter_amount_at_collision, p_amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ParticleProcessMaterial::get_sub_emitter_amount_at_collision() const {
|
||||||
|
return sub_emitter_amount_at_collision;
|
||||||
|
}
|
||||||
|
|
||||||
void ParticleProcessMaterial::set_sub_emitter_keep_velocity(bool p_enable) {
|
void ParticleProcessMaterial::set_sub_emitter_keep_velocity(bool p_enable) {
|
||||||
sub_emitter_keep_velocity = p_enable;
|
sub_emitter_keep_velocity = p_enable;
|
||||||
RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->sub_emitter_keep_velocity, p_enable);
|
RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->sub_emitter_keep_velocity, p_enable);
|
||||||
@@ -1640,6 +1657,9 @@ void ParticleProcessMaterial::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("get_sub_emitter_amount_at_end"), &ParticleProcessMaterial::get_sub_emitter_amount_at_end);
|
ClassDB::bind_method(D_METHOD("get_sub_emitter_amount_at_end"), &ParticleProcessMaterial::get_sub_emitter_amount_at_end);
|
||||||
ClassDB::bind_method(D_METHOD("set_sub_emitter_amount_at_end", "amount"), &ParticleProcessMaterial::set_sub_emitter_amount_at_end);
|
ClassDB::bind_method(D_METHOD("set_sub_emitter_amount_at_end", "amount"), &ParticleProcessMaterial::set_sub_emitter_amount_at_end);
|
||||||
|
|
||||||
|
ClassDB::bind_method(D_METHOD("get_sub_emitter_amount_at_collision"), &ParticleProcessMaterial::get_sub_emitter_amount_at_collision);
|
||||||
|
ClassDB::bind_method(D_METHOD("set_sub_emitter_amount_at_collision", "amount"), &ParticleProcessMaterial::set_sub_emitter_amount_at_collision);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("get_sub_emitter_keep_velocity"), &ParticleProcessMaterial::get_sub_emitter_keep_velocity);
|
ClassDB::bind_method(D_METHOD("get_sub_emitter_keep_velocity"), &ParticleProcessMaterial::get_sub_emitter_keep_velocity);
|
||||||
ClassDB::bind_method(D_METHOD("set_sub_emitter_keep_velocity", "enable"), &ParticleProcessMaterial::set_sub_emitter_keep_velocity);
|
ClassDB::bind_method(D_METHOD("set_sub_emitter_keep_velocity", "enable"), &ParticleProcessMaterial::set_sub_emitter_keep_velocity);
|
||||||
|
|
||||||
@@ -1752,6 +1772,7 @@ void ParticleProcessMaterial::_bind_methods() {
|
|||||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "sub_emitter_mode", PROPERTY_HINT_ENUM, "Disabled,Constant,At End,At Collision"), "set_sub_emitter_mode", "get_sub_emitter_mode");
|
ADD_PROPERTY(PropertyInfo(Variant::INT, "sub_emitter_mode", PROPERTY_HINT_ENUM, "Disabled,Constant,At End,At Collision"), "set_sub_emitter_mode", "get_sub_emitter_mode");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sub_emitter_frequency", PROPERTY_HINT_RANGE, "0.01,100,0.01,suffix:Hz"), "set_sub_emitter_frequency", "get_sub_emitter_frequency");
|
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sub_emitter_frequency", PROPERTY_HINT_RANGE, "0.01,100,0.01,suffix:Hz"), "set_sub_emitter_frequency", "get_sub_emitter_frequency");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "sub_emitter_amount_at_end", PROPERTY_HINT_RANGE, "1,32,1"), "set_sub_emitter_amount_at_end", "get_sub_emitter_amount_at_end");
|
ADD_PROPERTY(PropertyInfo(Variant::INT, "sub_emitter_amount_at_end", PROPERTY_HINT_RANGE, "1,32,1"), "set_sub_emitter_amount_at_end", "get_sub_emitter_amount_at_end");
|
||||||
|
ADD_PROPERTY(PropertyInfo(Variant::INT, "sub_emitter_amount_at_collision", PROPERTY_HINT_RANGE, "1,32,1"), "set_sub_emitter_amount_at_collision", "get_sub_emitter_amount_at_collision");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sub_emitter_keep_velocity"), "set_sub_emitter_keep_velocity", "get_sub_emitter_keep_velocity");
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sub_emitter_keep_velocity"), "set_sub_emitter_keep_velocity", "get_sub_emitter_keep_velocity");
|
||||||
|
|
||||||
ADD_GROUP("Attractor Interaction", "attractor_interaction_");
|
ADD_GROUP("Attractor Interaction", "attractor_interaction_");
|
||||||
@@ -1859,6 +1880,7 @@ ParticleProcessMaterial::ParticleProcessMaterial() :
|
|||||||
set_sub_emitter_mode(SUB_EMITTER_DISABLED);
|
set_sub_emitter_mode(SUB_EMITTER_DISABLED);
|
||||||
set_sub_emitter_frequency(4);
|
set_sub_emitter_frequency(4);
|
||||||
set_sub_emitter_amount_at_end(1);
|
set_sub_emitter_amount_at_end(1);
|
||||||
|
set_sub_emitter_amount_at_collision(1);
|
||||||
set_sub_emitter_keep_velocity(false);
|
set_sub_emitter_keep_velocity(false);
|
||||||
|
|
||||||
set_attractor_interaction_enabled(true);
|
set_attractor_interaction_enabled(true);
|
||||||
|
|||||||
@@ -246,6 +246,7 @@ private:
|
|||||||
|
|
||||||
StringName sub_emitter_frequency;
|
StringName sub_emitter_frequency;
|
||||||
StringName sub_emitter_amount_at_end;
|
StringName sub_emitter_amount_at_end;
|
||||||
|
StringName sub_emitter_amount_at_collision;
|
||||||
StringName sub_emitter_keep_velocity;
|
StringName sub_emitter_keep_velocity;
|
||||||
|
|
||||||
StringName collision_friction;
|
StringName collision_friction;
|
||||||
@@ -304,6 +305,7 @@ private:
|
|||||||
SubEmitterMode sub_emitter_mode;
|
SubEmitterMode sub_emitter_mode;
|
||||||
double sub_emitter_frequency = 0.0;
|
double sub_emitter_frequency = 0.0;
|
||||||
int sub_emitter_amount_at_end = 0;
|
int sub_emitter_amount_at_end = 0;
|
||||||
|
int sub_emitter_amount_at_collision = 0;
|
||||||
bool sub_emitter_keep_velocity = false;
|
bool sub_emitter_keep_velocity = false;
|
||||||
//do not save emission points here
|
//do not save emission points here
|
||||||
|
|
||||||
@@ -418,6 +420,9 @@ public:
|
|||||||
void set_sub_emitter_amount_at_end(int p_amount);
|
void set_sub_emitter_amount_at_end(int p_amount);
|
||||||
int get_sub_emitter_amount_at_end() const;
|
int get_sub_emitter_amount_at_end() const;
|
||||||
|
|
||||||
|
void set_sub_emitter_amount_at_collision(int p_amount);
|
||||||
|
int get_sub_emitter_amount_at_collision() const;
|
||||||
|
|
||||||
void set_sub_emitter_keep_velocity(bool p_enable);
|
void set_sub_emitter_keep_velocity(bool p_enable);
|
||||||
bool get_sub_emitter_keep_velocity() const;
|
bool get_sub_emitter_keep_velocity() const;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user