1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-11 13:10:58 +00:00

Add visualization of 3D particle emission shapes

Co-authored-by: Kasper Arnklit Frandsen <kasper.arnklit@gmail.com>
This commit is contained in:
Patrick Exner
2024-12-04 18:17:33 +01:00
parent d09d82d433
commit e689c122a6
7 changed files with 458 additions and 0 deletions

View File

@@ -1567,16 +1567,25 @@ void ParticleProcessMaterial::set_emission_shape(EmissionShape p_shape) {
emission_shape = p_shape;
notify_property_list_changed();
_queue_shader_change();
#ifdef TOOLS_ENABLED
emit_signal("emission_shape_changed");
#endif
}
void ParticleProcessMaterial::set_emission_sphere_radius(real_t p_radius) {
emission_sphere_radius = p_radius;
RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->emission_sphere_radius, p_radius);
#ifdef TOOLS_ENABLED
emit_signal("emission_shape_changed");
#endif
}
void ParticleProcessMaterial::set_emission_box_extents(Vector3 p_extents) {
emission_box_extents = p_extents;
RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->emission_box_extents, p_extents);
#ifdef TOOLS_ENABLED
emit_signal("emission_shape_changed");
#endif
}
void ParticleProcessMaterial::set_emission_point_texture(const Ref<Texture2D> &p_points) {
@@ -1606,26 +1615,41 @@ void ParticleProcessMaterial::set_emission_point_count(int p_count) {
void ParticleProcessMaterial::set_emission_ring_axis(Vector3 p_axis) {
emission_ring_axis = p_axis;
RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->emission_ring_axis, p_axis);
#ifdef TOOLS_ENABLED
emit_signal("emission_shape_changed");
#endif
}
void ParticleProcessMaterial::set_emission_ring_height(real_t p_height) {
emission_ring_height = p_height;
RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->emission_ring_height, p_height);
#ifdef TOOLS_ENABLED
emit_signal("emission_shape_changed");
#endif
}
void ParticleProcessMaterial::set_emission_ring_radius(real_t p_radius) {
emission_ring_radius = p_radius;
RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->emission_ring_radius, p_radius);
#ifdef TOOLS_ENABLED
emit_signal("emission_shape_changed");
#endif
}
void ParticleProcessMaterial::set_emission_ring_inner_radius(real_t p_radius) {
emission_ring_inner_radius = p_radius;
RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->emission_ring_inner_radius, p_radius);
#ifdef TOOLS_ENABLED
emit_signal("emission_shape_changed");
#endif
}
void ParticleProcessMaterial::set_emission_ring_cone_angle(real_t p_angle) {
emission_ring_cone_angle = p_angle;
RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->emission_ring_cone_angle, p_angle);
#ifdef TOOLS_ENABLED
emit_signal("emission_shape_changed");
#endif
}
void ParticleProcessMaterial::set_inherit_velocity_ratio(double p_ratio) {
@@ -1684,6 +1708,9 @@ real_t ParticleProcessMaterial::get_emission_ring_cone_angle() const {
void ParticleProcessMaterial::set_emission_shape_offset(const Vector3 &p_emission_shape_offset) {
emission_shape_offset = p_emission_shape_offset;
RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->emission_shape_offset, p_emission_shape_offset);
#ifdef TOOLS_ENABLED
emit_signal("emission_shape_changed");
#endif
}
Vector3 ParticleProcessMaterial::get_emission_shape_offset() const {
@@ -1693,6 +1720,9 @@ Vector3 ParticleProcessMaterial::get_emission_shape_offset() const {
void ParticleProcessMaterial::set_emission_shape_scale(const Vector3 &p_emission_shape_scale) {
emission_shape_scale = p_emission_shape_scale;
RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->emission_shape_scale, p_emission_shape_scale);
#ifdef TOOLS_ENABLED
emit_signal("emission_shape_changed");
#endif
}
Vector3 ParticleProcessMaterial::get_emission_shape_scale() const {
@@ -2209,6 +2239,8 @@ void ParticleProcessMaterial::_bind_methods() {
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_SIGNAL(MethodInfo("emission_shape_changed"));
BIND_ENUM_CONSTANT(PARAM_INITIAL_LINEAR_VELOCITY);
BIND_ENUM_CONSTANT(PARAM_ANGULAR_VELOCITY);
BIND_ENUM_CONSTANT(PARAM_ORBIT_VELOCITY);