diff options
Diffstat (limited to 'scene/3d')
-rw-r--r-- | scene/3d/particles.cpp | 119 | ||||
-rw-r--r-- | scene/3d/particles.h | 22 |
2 files changed, 110 insertions, 31 deletions
diff --git a/scene/3d/particles.cpp b/scene/3d/particles.cpp index b7ee26de57..038ca33a41 100644 --- a/scene/3d/particles.cpp +++ b/scene/3d/particles.cpp @@ -71,15 +71,12 @@ void Particles::set_randomness_ratio(float p_ratio) { randomness_ratio = p_ratio; VS::get_singleton()->particles_set_randomness_ratio(particles, randomness_ratio); } -void Particles::set_custom_aabb(const Rect3 &p_aabb) { +void Particles::set_visibility_aabb(const Rect3 &p_aabb) { - custom_aabb = p_aabb; - VS::get_singleton()->particles_set_custom_aabb(particles, custom_aabb); -} -void Particles::set_gravity(const Vector3 &p_gravity) { - - gravity = p_gravity; - VS::get_singleton()->particles_set_gravity(particles, gravity); + visibility_aabb = p_aabb; + VS::get_singleton()->particles_set_custom_aabb(particles, visibility_aabb); + update_gizmo(); + _change_notify("visibility_aabb"); } void Particles::set_use_local_coordinates(bool p_enable) { @@ -93,6 +90,14 @@ void Particles::set_process_material(const Ref<Material> &p_material) { if (process_material.is_valid()) material_rid = process_material->get_rid(); VS::get_singleton()->particles_set_process_material(particles, material_rid); + + update_configuration_warning(); +} + +void Particles::set_speed_scale(float p_scale) { + + speed_scale = p_scale; + VS::get_singleton()->particles_set_speed_scale(particles, p_scale); } bool Particles::is_emitting() const { @@ -119,13 +124,9 @@ float Particles::get_randomness_ratio() const { return randomness_ratio; } -Rect3 Particles::get_custom_aabb() const { - - return custom_aabb; -} -Vector3 Particles::get_gravity() const { +Rect3 Particles::get_visibility_aabb() const { - return gravity; + return visibility_aabb; } bool Particles::get_use_local_coordinates() const { @@ -136,6 +137,11 @@ Ref<Material> Particles::get_process_material() const { return process_material; } +float Particles::get_speed_scale() const { + + return speed_scale; +} + void Particles::set_draw_order(DrawOrder p_order) { draw_order = p_order; @@ -170,6 +176,8 @@ void Particles::set_draw_pass_mesh(int p_pass, const Ref<Mesh> &p_mesh) { mesh_rid = p_mesh->get_rid(); VS::get_singleton()->particles_set_draw_pass_mesh(particles, p_pass, mesh_rid); + + update_configuration_warning(); } Ref<Mesh> Particles::get_draw_pass_mesh(int p_pass) const { @@ -197,6 +205,37 @@ bool Particles::get_fractional_delta() const { return fractional_delta; } +String Particles::get_configuration_warning() const { + + String warnings; + + bool meshes_found = false; + + for (int i = 0; i < draw_passes.size(); i++) { + if (draw_passes[i].is_valid()) { + meshes_found = true; + break; + } + } + + if (!meshes_found) { + warnings += "- " + TTR("Nothing is visible because meshes have not been assigned to draw passes."); + } + + if (process_material.is_null()) { + if (warnings != String()) + warnings += "\n"; + warnings += "- " + TTR("A material to process the particles is not assigned, so no behavior is imprinted."); + } + + return warnings; +} + +Rect3 Particles::capture_aabb() const { + + return VS::get_singleton()->particles_get_current_aabb(particles); +} + void Particles::_validate_property(PropertyInfo &property) const { if (property.name.begins_with("draw_pass_")) { @@ -216,12 +255,12 @@ void Particles::_bind_methods() { ClassDB::bind_method(D_METHOD("set_pre_process_time", "secs"), &Particles::set_pre_process_time); ClassDB::bind_method(D_METHOD("set_explosiveness_ratio", "ratio"), &Particles::set_explosiveness_ratio); ClassDB::bind_method(D_METHOD("set_randomness_ratio", "ratio"), &Particles::set_randomness_ratio); - ClassDB::bind_method(D_METHOD("set_custom_aabb", "aabb"), &Particles::set_custom_aabb); - ClassDB::bind_method(D_METHOD("set_gravity", "accel_vec"), &Particles::set_gravity); + ClassDB::bind_method(D_METHOD("set_visibility_aabb", "aabb"), &Particles::set_visibility_aabb); ClassDB::bind_method(D_METHOD("set_use_local_coordinates", "enable"), &Particles::set_use_local_coordinates); ClassDB::bind_method(D_METHOD("set_fixed_fps", "fps"), &Particles::set_fixed_fps); ClassDB::bind_method(D_METHOD("set_fractional_delta", "enable"), &Particles::set_fractional_delta); ClassDB::bind_method(D_METHOD("set_process_material", "material:Material"), &Particles::set_process_material); + ClassDB::bind_method(D_METHOD("set_speed_scale", "scale"), &Particles::set_speed_scale); ClassDB::bind_method(D_METHOD("is_emitting"), &Particles::is_emitting); ClassDB::bind_method(D_METHOD("get_amount"), &Particles::get_amount); @@ -229,12 +268,12 @@ void Particles::_bind_methods() { ClassDB::bind_method(D_METHOD("get_pre_process_time"), &Particles::get_pre_process_time); ClassDB::bind_method(D_METHOD("get_explosiveness_ratio"), &Particles::get_explosiveness_ratio); ClassDB::bind_method(D_METHOD("get_randomness_ratio"), &Particles::get_randomness_ratio); - ClassDB::bind_method(D_METHOD("get_custom_aabb"), &Particles::get_custom_aabb); - ClassDB::bind_method(D_METHOD("get_gravity"), &Particles::get_gravity); + ClassDB::bind_method(D_METHOD("get_visibility_aabb"), &Particles::get_visibility_aabb); ClassDB::bind_method(D_METHOD("get_use_local_coordinates"), &Particles::get_use_local_coordinates); ClassDB::bind_method(D_METHOD("get_fixed_fps"), &Particles::get_fixed_fps); ClassDB::bind_method(D_METHOD("get_fractional_delta"), &Particles::get_fractional_delta); ClassDB::bind_method(D_METHOD("get_process_material:Material"), &Particles::get_process_material); + ClassDB::bind_method(D_METHOD("get_speed_scale"), &Particles::get_speed_scale); ClassDB::bind_method(D_METHOD("set_draw_order", "order"), &Particles::set_draw_order); @@ -246,20 +285,23 @@ void Particles::_bind_methods() { ClassDB::bind_method(D_METHOD("get_draw_passes"), &Particles::get_draw_passes); ClassDB::bind_method(D_METHOD("get_draw_pass_mesh:Mesh", "pass"), &Particles::get_draw_pass_mesh); + ClassDB::bind_method(D_METHOD("capture_aabb"), &Particles::capture_aabb); + ADD_GROUP("Parameters", ""); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "emitting"), "set_emitting", "is_emitting"); ADD_PROPERTY(PropertyInfo(Variant::INT, "amount", PROPERTY_HINT_RANGE, "1,100000,1"), "set_amount", "get_amount"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "lifetime", PROPERTY_HINT_RANGE, "0.01,600.0,0.01"), "set_lifetime", "get_lifetime"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "preprocess", PROPERTY_HINT_RANGE, "0.00,600.0,0.01"), "set_pre_process_time", "get_pre_process_time"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "speed_scale", PROPERTY_HINT_RANGE, "0.01,64,0.01"), "set_speed_scale", "get_speed_scale"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "explosiveness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_explosiveness_ratio", "get_explosiveness_ratio"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "randomness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_randomness_ratio", "get_randomness_ratio"); - ADD_PROPERTY(PropertyInfo(Variant::RECT3, "custom_aabb"), "set_custom_aabb", "get_custom_aabb"); - ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "gravity"), "set_gravity", "get_gravity"); + ADD_PROPERTY(PropertyInfo(Variant::RECT3, "visibility_aabb"), "set_visibility_aabb", "get_visibility_aabb"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "local_coords"), "set_use_local_coordinates", "get_use_local_coordinates"); ADD_PROPERTY(PropertyInfo(Variant::INT, "fixed_fps", PROPERTY_HINT_RANGE, "0,1000,1"), "set_fixed_fps", "get_fixed_fps"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "fract_delta"), "set_fractional_delta", "get_fractional_delta"); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "process_material", PROPERTY_HINT_RESOURCE_TYPE, "ParticlesMaterial,ShaderMaterial"), "set_process_material", "get_process_material"); ADD_PROPERTY(PropertyInfo(Variant::INT, "draw_order", PROPERTY_HINT_ENUM, "Index,Lifetime,View Depth"), "set_draw_order", "get_draw_order"); + ADD_GROUP("Process Material", ""); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "process_material", PROPERTY_HINT_RESOURCE_TYPE, "ParticlesMaterial,ShaderMaterial"), "set_process_material", "get_process_material"); ADD_GROUP("Draw Passes", "draw_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "draw_passes", PROPERTY_HINT_RANGE, "0," + itos(MAX_DRAW_PASSES) + ",1"), "set_draw_passes", "get_draw_passes"); for (int i = 0; i < MAX_DRAW_PASSES; i++) { @@ -278,16 +320,18 @@ Particles::Particles() { particles = VS::get_singleton()->particles_create(); set_base(particles); set_emitting(true); - set_amount(100); + set_amount(8); set_lifetime(1); set_fixed_fps(0); set_fractional_delta(true); set_pre_process_time(0); set_explosiveness_ratio(0); set_randomness_ratio(0); - set_gravity(Vector3(0, -9.8, 0)); + set_visibility_aabb(Rect3(Vector3(-4, -4, -4), Vector3(8, 8, 8))); set_use_local_coordinates(true); set_draw_passes(1); + set_draw_order(DRAW_ORDER_INDEX); + set_speed_scale(1); } Particles::~Particles() { @@ -362,6 +406,8 @@ void ParticlesMaterial::init_shaders() { shader_names->trail_divisor = "trail_divisor"; shader_names->trail_size_modifier = "trail_size_modifier"; shader_names->trail_color_modifier = "trail_color_modifier"; + + shader_names->gravity = "gravity"; } void ParticlesMaterial::finish_shaders() { @@ -437,6 +483,8 @@ void ParticlesMaterial::_update_shader() { code += "uniform int trail_divisor;\n"; + code += "uniform vec3 gravity;\n"; + if (color_ramp.is_valid()) code += "uniform sampler2D color_ramp;\n"; @@ -633,7 +681,7 @@ void ParticlesMaterial::_update_shader() { else code += " float tex_anim_offset = 0.0;\n"; - code += " vec3 force = vec3(0.0); \n"; + code += " vec3 force = gravity; \n"; code += " vec3 pos = TRANSFORM[3].xyz; \n"; code += " //apply linear acceleration\n"; code += " force+=normalize(VELOCITY) * (linear_accel+tex_linear_accel)*mix(1.0,rand_from_seed(alt_seed),linear_accel_random);\n"; @@ -643,7 +691,7 @@ void ParticlesMaterial::_update_shader() { code += " //org=p_transform.origin;\n"; code += " force+=normalize(pos-org) * (radial_accel+tex_radial_accel)*mix(1.0,rand_from_seed(alt_seed),radial_accel_random);\n"; code += " //apply tangential acceleration;\n"; - code += " force+=normalize(cross(normalize(pos-org),normalize(GRAVITY))) * ((tangent_accel+tex_tangent_accel)*mix(1.0,rand_from_seed(alt_seed),radial_accel_random));\n"; + code += " force+=normalize(cross(normalize(pos-org),normalize(gravity))) * ((tangent_accel+tex_tangent_accel)*mix(1.0,rand_from_seed(alt_seed),radial_accel_random));\n"; code += " //apply attractor forces\n"; code += " VELOCITY+=force * DELTA;\n"; if (tex_parameters[PARAM_INITIAL_LINEAR_VELOCITY].is_valid()) @@ -1168,6 +1216,21 @@ Ref<GradientTexture> ParticlesMaterial::get_trail_color_modifier() const { return trail_color_modifier; } +void ParticlesMaterial::set_gravity(const Vector3 &p_gravity) { + + gravity = p_gravity; + Vector3 gset = gravity; + if (gset == Vector3()) { + gset = Vector3(0, -0.000001, 0); //as gravity is used as upvector in some calculations + } + VisualServer::get_singleton()->material_set_param(_get_material(), shader_names->gravity, gset); +} + +Vector3 ParticlesMaterial::get_gravity() const { + + return gravity; +} + void ParticlesMaterial::_validate_property(PropertyInfo &property) const { if (property.name == "color" && color_ramp.is_valid()) { @@ -1248,6 +1311,9 @@ void ParticlesMaterial::_bind_methods() { ClassDB::bind_method(D_METHOD("set_trail_color_modifier", "texture:GradientTexture"), &ParticlesMaterial::set_trail_color_modifier); ClassDB::bind_method(D_METHOD("get_trail_color_modifier:GradientTexture"), &ParticlesMaterial::get_trail_color_modifier); + ClassDB::bind_method(D_METHOD("get_gravity"), &ParticlesMaterial::get_gravity); + ClassDB::bind_method(D_METHOD("set_gravity", "accel_vec"), &ParticlesMaterial::set_gravity); + ADD_GROUP("Trail", "trail_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "trail_divisor", PROPERTY_HINT_RANGE, "1,1000000,1"), "set_trail_divisor", "get_trail_divisor"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "trail_size_modifier", PROPERTY_HINT_RESOURCE_TYPE, "CurveTexture"), "set_trail_size_modifier", "get_trail_size_modifier"); @@ -1265,6 +1331,8 @@ void ParticlesMaterial::_bind_methods() { ADD_GROUP("Spread", ""); ADD_PROPERTY(PropertyInfo(Variant::REAL, "spread", PROPERTY_HINT_RANGE, "0,180,0.01"), "set_spread", "get_spread"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "flatness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_flatness", "get_flatness"); + ADD_GROUP("Gravity", ""); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "gravity"), "set_gravity", "get_gravity"); ADD_GROUP("Initial Velocity", "initial_"); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "initial_velocity", PROPERTY_HINT_RANGE, "0,1000,0.01"), "set_param", "get_param", PARAM_INITIAL_LINEAR_VELOCITY); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "initial_velocity_random", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param_randomness", "get_param_randomness", PARAM_INITIAL_LINEAR_VELOCITY); @@ -1361,6 +1429,7 @@ ParticlesMaterial::ParticlesMaterial() set_emission_sphere_radius(1); set_emission_box_extents(Vector3(1, 1, 1)); set_trail_divisor(1); + set_gravity(Vector3(0, -9.8, 0)); emission_point_count = 1; for (int i = 0; i < PARAM_MAX; i++) { diff --git a/scene/3d/particles.h b/scene/3d/particles.h index 3a46269396..63ebd7ed7b 100644 --- a/scene/3d/particles.h +++ b/scene/3d/particles.h @@ -63,8 +63,8 @@ private: float pre_process_time; float explosiveness_ratio; float randomness_ratio; - Rect3 custom_aabb; - Vector3 gravity; + float speed_scale; + Rect3 visibility_aabb; bool local_coords; int fixed_fps; bool fractional_delta; @@ -89,10 +89,10 @@ public: void set_pre_process_time(float p_time); void set_explosiveness_ratio(float p_ratio); void set_randomness_ratio(float p_ratio); - void set_custom_aabb(const Rect3 &p_aabb); - void set_gravity(const Vector3 &p_gravity); + void set_visibility_aabb(const Rect3 &p_aabb); void set_use_local_coordinates(bool p_enable); void set_process_material(const Ref<Material> &p_material); + void set_speed_scale(float p_scale); bool is_emitting() const; int get_amount() const; @@ -100,10 +100,10 @@ public: float get_pre_process_time() const; float get_explosiveness_ratio() const; float get_randomness_ratio() const; - Rect3 get_custom_aabb() const; - Vector3 get_gravity() const; + Rect3 get_visibility_aabb() const; bool get_use_local_coordinates() const; Ref<Material> get_process_material() const; + float get_speed_scale() const; void set_fixed_fps(int p_count); int get_fixed_fps() const; @@ -120,6 +120,9 @@ public: void set_draw_pass_mesh(int p_pass, const Ref<Mesh> &p_mesh); Ref<Mesh> get_draw_pass_mesh(int p_pass) const; + virtual String get_configuration_warning() const; + + Rect3 capture_aabb() const; Particles(); ~Particles(); }; @@ -270,6 +273,8 @@ private: StringName trail_divisor; StringName trail_size_modifier; StringName trail_color_modifier; + + StringName gravity; }; static ShaderNames *shader_names; @@ -304,6 +309,8 @@ private: Ref<CurveTexture> trail_size_modifier; Ref<GradientTexture> trail_color_modifier; + Vector3 gravity; + //do not save emission points here protected: @@ -358,6 +365,9 @@ public: void set_trail_color_modifier(const Ref<GradientTexture> &p_trail_color_modifier); Ref<GradientTexture> get_trail_color_modifier() const; + void set_gravity(const Vector3 &p_gravity); + Vector3 get_gravity() const; + static void init_shaders(); static void finish_shaders(); static void flush_changes(); |