|
@@ -132,6 +132,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_amount_at_collision = "sub_emitter_amount_at_collision";
|
|
|
|
+ shader_names->sub_emitter_amount_at_start = "sub_emitter_amount_at_start";
|
|
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";
|
|
@@ -287,6 +288,9 @@ void ParticleProcessMaterial::_update_shader() {
|
|
if (sub_emitter_mode == SUB_EMITTER_AT_COLLISION) {
|
|
if (sub_emitter_mode == SUB_EMITTER_AT_COLLISION) {
|
|
code += "uniform int sub_emitter_amount_at_collision;\n";
|
|
code += "uniform int sub_emitter_amount_at_collision;\n";
|
|
}
|
|
}
|
|
|
|
+ if (sub_emitter_mode == SUB_EMITTER_AT_START) {
|
|
|
|
+ code += "uniform int sub_emitter_amount_at_start;\n";
|
|
|
|
+ }
|
|
code += "uniform bool sub_emitter_keep_velocity;\n";
|
|
code += "uniform bool sub_emitter_keep_velocity;\n";
|
|
}
|
|
}
|
|
|
|
|
|
@@ -918,6 +922,10 @@ void ParticleProcessMaterial::_update_shader() {
|
|
code += " float pi = 3.14159;\n";
|
|
code += " float pi = 3.14159;\n";
|
|
code += " float degree_to_rad = pi / 180.0;\n\n";
|
|
code += " float degree_to_rad = pi / 180.0;\n\n";
|
|
|
|
|
|
|
|
+ if (sub_emitter_mode == SUB_EMITTER_AT_START && !RenderingServer::get_singleton()->is_low_end()) {
|
|
|
|
+ code += " bool just_spawned = CUSTOM.y == 0.0;\n";
|
|
|
|
+ }
|
|
|
|
+
|
|
code += " CUSTOM.y += DELTA / LIFETIME;\n";
|
|
code += " CUSTOM.y += DELTA / LIFETIME;\n";
|
|
code += " CUSTOM.y = mix(CUSTOM.y, 1.0, INTERPOLATE_TO_END);\n";
|
|
code += " CUSTOM.y = mix(CUSTOM.y, 1.0, INTERPOLATE_TO_END);\n";
|
|
code += " float lifetime_percent = CUSTOM.y / params.lifetime;\n";
|
|
code += " float lifetime_percent = CUSTOM.y / params.lifetime;\n";
|
|
@@ -1134,6 +1142,11 @@ void ParticleProcessMaterial::_update_shader() {
|
|
code += " emit_count = sub_emitter_amount_at_end;\n";
|
|
code += " emit_count = sub_emitter_amount_at_end;\n";
|
|
code += " }\n";
|
|
code += " }\n";
|
|
} break;
|
|
} break;
|
|
|
|
+ case SUB_EMITTER_AT_START: {
|
|
|
|
+ code += " if (just_spawned) {\n";
|
|
|
|
+ code += " emit_count = sub_emitter_amount_at_start;\n";
|
|
|
|
+ code += " }\n";
|
|
|
|
+ } break;
|
|
default: {
|
|
default: {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -1819,6 +1832,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_start" && sub_emitter_mode != SUB_EMITTER_AT_START) {
|
|
|
|
+ p_property.usage = PROPERTY_USAGE_NONE;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (!turbulence_enabled) {
|
|
if (!turbulence_enabled) {
|
|
if (p_property.name == "turbulence_noise_strength" ||
|
|
if (p_property.name == "turbulence_noise_strength" ||
|
|
p_property.name == "turbulence_noise_scale" ||
|
|
p_property.name == "turbulence_noise_scale" ||
|
|
@@ -1893,6 +1910,15 @@ int ParticleProcessMaterial::get_sub_emitter_amount_at_collision() const {
|
|
return sub_emitter_amount_at_collision;
|
|
return sub_emitter_amount_at_collision;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void ParticleProcessMaterial::set_sub_emitter_amount_at_start(int p_amount) {
|
|
|
|
+ sub_emitter_amount_at_start = p_amount;
|
|
|
|
+ RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->sub_emitter_amount_at_start, p_amount);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int ParticleProcessMaterial::get_sub_emitter_amount_at_start() const {
|
|
|
|
+ return sub_emitter_amount_at_start;
|
|
|
|
+}
|
|
|
|
+
|
|
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);
|
|
@@ -2074,6 +2100,9 @@ void ParticleProcessMaterial::_bind_methods() {
|
|
ClassDB::bind_method(D_METHOD("get_sub_emitter_amount_at_collision"), &ParticleProcessMaterial::get_sub_emitter_amount_at_collision);
|
|
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("set_sub_emitter_amount_at_collision", "amount"), &ParticleProcessMaterial::set_sub_emitter_amount_at_collision);
|
|
|
|
|
|
|
|
+ ClassDB::bind_method(D_METHOD("get_sub_emitter_amount_at_start"), &ParticleProcessMaterial::get_sub_emitter_amount_at_start);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("set_sub_emitter_amount_at_start", "amount"), &ParticleProcessMaterial::set_sub_emitter_amount_at_start);
|
|
|
|
+
|
|
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);
|
|
|
|
|
|
@@ -2203,10 +2232,11 @@ void ParticleProcessMaterial::_bind_methods() {
|
|
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "collision_bounce", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_collision_bounce", "get_collision_bounce");
|
|
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "collision_bounce", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_collision_bounce", "get_collision_bounce");
|
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collision_use_scale"), "set_collision_use_scale", "is_collision_using_scale");
|
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collision_use_scale"), "set_collision_use_scale", "is_collision_using_scale");
|
|
ADD_GROUP("Sub Emitter", "sub_emitter_");
|
|
ADD_GROUP("Sub Emitter", "sub_emitter_");
|
|
- 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:0,Constant:1,At Start:4,At End:2,At Collision:3"), "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::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::INT, "sub_emitter_amount_at_start", PROPERTY_HINT_RANGE, "1,32,1"), "set_sub_emitter_amount_at_start", "get_sub_emitter_amount_at_start");
|
|
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");
|
|
|
|
|
|
BIND_ENUM_CONSTANT(PARAM_INITIAL_LINEAR_VELOCITY);
|
|
BIND_ENUM_CONSTANT(PARAM_INITIAL_LINEAR_VELOCITY);
|
|
@@ -2249,6 +2279,7 @@ void ParticleProcessMaterial::_bind_methods() {
|
|
BIND_ENUM_CONSTANT(SUB_EMITTER_CONSTANT);
|
|
BIND_ENUM_CONSTANT(SUB_EMITTER_CONSTANT);
|
|
BIND_ENUM_CONSTANT(SUB_EMITTER_AT_END);
|
|
BIND_ENUM_CONSTANT(SUB_EMITTER_AT_END);
|
|
BIND_ENUM_CONSTANT(SUB_EMITTER_AT_COLLISION);
|
|
BIND_ENUM_CONSTANT(SUB_EMITTER_AT_COLLISION);
|
|
|
|
+ BIND_ENUM_CONSTANT(SUB_EMITTER_AT_START);
|
|
BIND_ENUM_CONSTANT(SUB_EMITTER_MAX);
|
|
BIND_ENUM_CONSTANT(SUB_EMITTER_MAX);
|
|
|
|
|
|
BIND_ENUM_CONSTANT(COLLISION_DISABLED);
|
|
BIND_ENUM_CONSTANT(COLLISION_DISABLED);
|
|
@@ -2320,6 +2351,7 @@ ParticleProcessMaterial::ParticleProcessMaterial() :
|
|
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_amount_at_collision(1);
|
|
|
|
+ set_sub_emitter_amount_at_start(1);
|
|
set_sub_emitter_keep_velocity(false);
|
|
set_sub_emitter_keep_velocity(false);
|
|
|
|
|
|
set_attractor_interaction_enabled(true);
|
|
set_attractor_interaction_enabled(true);
|