[Bf-blender-cvs] [529305f] temp_hair_modifiers: RNA for particle modifiers.

Lukas Tönne noreply at git.blender.org
Tue Feb 3 17:25:22 CET 2015


Commit: 529305f4f64614ba607bb952a64d943f4915f299
Author: Lukas Tönne
Date:   Tue Feb 3 13:55:35 2015 +0100
Branches: temp_hair_modifiers
https://developer.blender.org/rB529305f4f64614ba607bb952a64d943f4915f299

RNA for particle modifiers.

===================================================================

M	source/blender/makesrna/intern/rna_particle.c

===================================================================

diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c
index 92e2cd9..005f3d9 100644
--- a/source/blender/makesrna/intern/rna_particle.c
+++ b/source/blender/makesrna/intern/rna_particle.c
@@ -139,7 +139,9 @@ static EnumPropertyItem part_hair_ren_as_items[] = {
 
 #include "BLI_listbase.h"
 #include "BLI_math.h"
+#include "BLI_string.h"
 
+#include "BKE_animsys.h"
 #include "BKE_context.h"
 #include "BKE_cloth.h"
 #include "BKE_colortools.h"
@@ -159,6 +161,83 @@ static EnumPropertyItem part_hair_ren_as_items[] = {
 
 #include "ED_particle.h"
 
+static StructRNA *rna_ParticleModifier_refine(struct PointerRNA *ptr)
+{
+	ParticleModifierData *md = (ParticleModifierData *)ptr->data;
+
+	switch ((ParticleModifierType)md->type) {
+		case eParticleModifierType_MeshDeform:
+			return &RNA_MeshDeformParticleModifier;
+		/* Default */
+		case eModifierType_None:
+		case NUM_PARTICLE_MODIFIER_TYPES:
+			return &RNA_ParticleModifier;
+	}
+
+	return &RNA_ParticleModifier;
+}
+
+static ParticleSystem *rna_particle_modifier_find_psys(Object *ob, ParticleModifierData *md)
+{
+	ParticleSystem *psys;
+	for (psys = ob->particlesystem.first; psys; psys = psys->next) {
+		if (BLI_findindex(&psys->modifiers, md) >= 0)
+			return psys;
+	}
+	return NULL;
+}
+
+static void rna_ParticleModifier_name_set(PointerRNA *ptr, const char *value)
+{
+	ParticleModifierData *md = ptr->data;
+	Object *ob = ptr->id.data;
+	ParticleSystem *psys = rna_particle_modifier_find_psys(ob, md);
+	char psys_name_esc[sizeof(psys->name) * 2];
+	char prefix[sizeof(psys->name) * 2 + strlen("particle_systems[\"\"].modifiers")];
+	char oldname[sizeof(md->name)];
+	
+	/* make a copy of the old name first */
+	BLI_strncpy(oldname, md->name, sizeof(md->name));
+	
+	/* copy the new name into the name slot */
+	BLI_strncpy_utf8(md->name, value, sizeof(md->name));
+	
+	/* make sure the name is truly unique */
+	if (ptr->id.data) {
+		particle_modifier_unique_name(&psys->modifiers, md);
+	}
+	
+	/* fix all the animation data which may link to this */
+	BLI_strescape(psys_name_esc, psys->name, sizeof(psys_name_esc));
+	BLI_snprintf(prefix, sizeof(prefix), "particle_systems[\"%s\"].modifiers", psys_name_esc);
+	BKE_all_animdata_fix_paths_rename(NULL, prefix, oldname, md->name);
+}
+
+static char *rna_ParticleModifier_path(PointerRNA *ptr)
+{
+	ParticleModifierData *md = ptr->data;
+	Object *ob = ptr->id.data;
+	ParticleSystem *psys = rna_particle_modifier_find_psys(ob, md);
+	char psys_name_esc[sizeof(psys->name) * 2];
+	char name_esc[sizeof(md->name) * 2];
+
+	BLI_strescape(psys_name_esc, psys->name, sizeof(psys_name_esc));
+	BLI_strescape(name_esc, md->name, sizeof(name_esc));
+	return BLI_sprintfN("particle_systems[\"%s\"].modifiers[\"%s\"]", psys_name_esc, name_esc);
+}
+
+static void rna_ParticleModifier_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
+{
+	DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
+	WM_main_add_notifier(NC_OBJECT | ND_PARTICLE, ptr->id.data);
+}
+
+static void rna_ParticleModifier_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+	rna_ParticleModifier_update(bmain, scene, ptr);
+	DAG_relations_tag_update(bmain);
+}
+
 /* use for object space hair get/set */
 static void rna_ParticleHairKey_location_object_info(PointerRNA *ptr, ParticleSystemModifierData **psmd_pt,
                                                      ParticleData **pa_pt)
@@ -3269,6 +3348,85 @@ static void rna_def_particle_target(BlenderRNA *brna)
 	RNA_def_property_update(prop, 0, "rna_Particle_target_reset");
 
 }
+
+static void rna_def_particle_modifier_meshdeform(BlenderRNA *brna)
+{
+	StructRNA *srna;
+	PropertyRNA *prop;
+
+	srna = RNA_def_struct(brna, "MeshDeformParticleModifier", "ParticleModifier");
+	RNA_def_struct_ui_text(srna, "MeshDeform Particle Modifier", "Deformation modifier to deform using a cage mesh");
+	RNA_def_struct_sdna(srna, "MeshDeformParticleModifierData");
+	RNA_def_struct_ui_icon(srna, ICON_MOD_MESHDEFORM);
+
+#if 0 // TODO
+	prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
+	RNA_def_property_ui_text(prop, "Object", "Mesh object to deform with");
+	RNA_def_property_pointer_funcs(prop, NULL, "rna_MeshDeformModifier_object_set", NULL, NULL);
+	RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
+	RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
+	
+	prop = RNA_def_property(srna, "is_bound", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_funcs(prop, "rna_MeshDeformModifier_is_bound_get", NULL);
+	RNA_def_property_ui_text(prop, "Bound", "Whether geometry has been bound to control cage");
+	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+	
+	prop = RNA_def_property(srna, "invert_vertex_group", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MDEF_INVERT_VGROUP);
+	RNA_def_property_ui_text(prop, "Invert", "Invert vertex group influence");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+	prop = RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
+	RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
+	RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name");
+	RNA_def_property_string_funcs(prop, NULL, NULL, "rna_MeshDeformModifier_defgrp_name_set");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+	prop = RNA_def_property(srna, "precision", PROP_INT, PROP_NONE);
+	RNA_def_property_int_sdna(prop, NULL, "gridsize");
+	RNA_def_property_range(prop, 2, 10);
+	RNA_def_property_ui_text(prop, "Precision", "The grid size for binding");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+	prop = RNA_def_property(srna, "use_dynamic_bind", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MDEF_DYNAMIC_BIND);
+	RNA_def_property_ui_text(prop, "Dynamic",
+	                         "Recompute binding dynamically on top of other deformers "
+	                         "(slower and more memory consuming)");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+#endif
+}
+
+static void rna_def_particle_modifier(BlenderRNA *brna)
+{
+	StructRNA *srna;
+	PropertyRNA *prop;
+	
+	/* data */
+	srna = RNA_def_struct(brna, "ParticleModifier", NULL);
+	RNA_def_struct_ui_text(srna, "Particle Modifier", "Modifier affecting a particle system");
+	RNA_def_struct_refine_func(srna, "rna_ParticleModifier_refine");
+	RNA_def_struct_path_func(srna, "rna_ParticleModifier_path");
+	RNA_def_struct_sdna(srna, "ParticleModifierData");
+	
+	/* strings */
+	prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+	RNA_def_property_string_funcs(prop, NULL, NULL, "rna_ParticleModifier_name_set");
+	RNA_def_property_ui_text(prop, "Name", "Modifier name");
+	RNA_def_property_update(prop, NC_OBJECT | ND_PARTICLE | NA_RENAME, NULL);
+	RNA_def_struct_name_property(srna, prop);
+	
+	/* enums */
+	prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+	RNA_def_property_enum_sdna(prop, NULL, "type");
+	RNA_def_property_enum_items(prop, particle_modifier_type_items);
+	RNA_def_property_ui_text(prop, "Type", "");
+	
+	/* types */
+	rna_def_particle_modifier_meshdeform(brna);
+}
+
 static void rna_def_particle_system(BlenderRNA *brna)
 {
 	StructRNA *srna;
@@ -3662,6 +3820,7 @@ void RNA_def_particle(BlenderRNA *brna)
 	rna_def_fluid_settings(brna);
 	rna_def_particle_hair_key(brna);
 	rna_def_particle_key(brna);
+	rna_def_particle_modifier(brna);
 	
 	rna_def_child_particle(brna);
 	rna_def_particle(brna);




More information about the Bf-blender-cvs mailing list