[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24265] trunk/blender/source/blender/ makesrna/intern: * Fix for bug [#19726] Cannot add FCurve to any option under the physics panel except cloth

Matt Ebb matt at mke3.net
Tue Nov 3 03:49:48 CET 2009


Revision: 24265
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24265
Author:   broken
Date:     2009-11-03 03:49:36 +0100 (Tue, 03 Nov 2009)

Log Message:
-----------
* Fix for bug [#19726] Cannot add FCurve to any option under the physics panel except cloth

I had to add some ugly RNA path finding code here, checking for all places these structs can possibly be reused. Can't think of a better way to go about this though with the path stored in the RNA type...?

Modified Paths:
--------------
    trunk/blender/source/blender/makesrna/intern/rna_object.c
    trunk/blender/source/blender/makesrna/intern/rna_object_force.c

Modified: trunk/blender/source/blender/makesrna/intern/rna_object.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_object.c	2009-11-02 23:55:04 UTC (rev 24264)
+++ trunk/blender/source/blender/makesrna/intern/rna_object.c	2009-11-03 02:49:36 UTC (rev 24265)
@@ -1493,6 +1493,7 @@
 
 	prop= RNA_def_property(srna, "soft_body", PROP_POINTER, PROP_NONE);
 	RNA_def_property_pointer_sdna(prop, NULL, "soft");
+	RNA_def_property_struct_type(prop, "SoftBodySettings");
 	RNA_def_property_ui_text(prop, "Soft Body Settings", "Settings for soft body simulation.");
 
 	prop= RNA_def_property(srna, "particle_systems", PROP_COLLECTION, PROP_NONE);

Modified: trunk/blender/source/blender/makesrna/intern/rna_object_force.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_object_force.c	2009-11-02 23:55:04 UTC (rev 24264)
+++ trunk/blender/source/blender/makesrna/intern/rna_object_force.c	2009-11-03 02:49:36 UTC (rev 24265)
@@ -29,10 +29,12 @@
 
 #include "rna_internal.h"
 
+#include "DNA_cloth_types.h"
 #include "DNA_object_types.h"
 #include "DNA_object_force.h"
 #include "DNA_particle_types.h"
 #include "DNA_scene_types.h"
+#include "DNA_smoke_types.h"
 
 #include "WM_api.h"
 #include "WM_types.h"
@@ -292,6 +294,15 @@
 
 	BLI_freelistN(&pidlist);
 }
+
+static char *rna_CollisionSettings_path(PointerRNA *ptr)
+{
+	Object *ob= (Object*)ptr->id.data;
+	ModifierData *md = (ModifierData *)modifiers_findByType(ob, eModifierType_Collision);
+	
+	return BLI_sprintfN("modifiers[%s].settings", md->name);
+}
+
 static int rna_SoftBodySettings_use_edges_get(PointerRNA *ptr)
 {
 	Object *data= (Object*)(ptr->id.data);
@@ -401,15 +412,24 @@
 	rna_object_vgroup_name_index_set(ptr, value, &sb->vertgroup);
 }
 
-static int particle_field_check(PointerRNA *ptr)
+static char *rna_SoftBodySettings_path(PointerRNA *ptr)
 {
+	Object *ob= (Object*)ptr->id.data;
+	ModifierData *md = (ModifierData *)modifiers_findByType(ob, eModifierType_Softbody);
+	
+	return BLI_sprintfN("modifiers[%s].settings", md->name);
+}
+
+static int particle_id_check(PointerRNA *ptr)
+{
 	ID *id= ptr->id.data;
 
 	return (GS(id->name) == ID_PA);
 }
+
 static void rna_FieldSettings_update(bContext *C, PointerRNA *ptr)
 {
-	if(particle_field_check(ptr)) {
+	if(particle_id_check(ptr)) {
 		ParticleSettings *part = (ParticleSettings*)ptr->id.data;
 
 		if(part->pd->forcefield != PFIELD_TEXTURE && part->pd->tex) {
@@ -443,7 +463,7 @@
 {
 	Scene *scene= CTX_data_scene(C);
 
-	if(!particle_field_check(ptr)) {
+	if(!particle_id_check(ptr)) {
 		Object *ob= (Object*)ptr->id.data;
 		PartDeflect *pd= ob->pd;
 		ModifierData *md= modifiers_findByType(ob, eModifierType_Surface);
@@ -467,7 +487,7 @@
 {
 	Scene *scene= CTX_data_scene(C);
 
-	if(particle_field_check(ptr)) {
+	if(particle_id_check(ptr)) {
 		DAG_id_flush_update((ID*)ptr->id.data, OB_RECALC|PSYS_RECALC_RESET);
 	}
 	else {
@@ -493,6 +513,30 @@
 	}
 }
 
+static char *rna_FieldSettings_path(PointerRNA *ptr)
+{
+	PartDeflect *pd = (PartDeflect *)ptr->data;
+	
+	/* Check through all possible places the settings can be to find the right one */
+	
+	if(particle_id_check(ptr)) {
+		/* particle system force field */
+		ParticleSettings *part = (ParticleSettings*)ptr->id.data;
+		
+		if (part->pd == pd)
+			return BLI_sprintfN("force_field_1");
+		else if (part->pd2 == pd)
+			return BLI_sprintfN("force_field_2");
+	} else {
+		/* object force field */
+		Object *ob= (Object*)ptr->id.data;
+		
+		if (ob->pd == pd)
+			return BLI_sprintfN("field");
+	}
+	return NULL;
+}
+
 static void rna_EffectorWeight_update(bContext *C, PointerRNA *ptr)
 {
 	DAG_id_flush_update((ID*)ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
@@ -510,6 +554,51 @@
 
 	WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, NULL);
 }
+
+static char *rna_EffectorWeight_path(PointerRNA *ptr)
+{
+	EffectorWeights *ew = (EffectorWeights *)ptr->data;
+	/* Check through all possible places the settings can be to find the right one */
+	
+	if(particle_id_check(ptr)) {
+		/* particle effector weights */
+		ParticleSettings *part = (ParticleSettings*)ptr->id.data;
+		
+		if (part->effector_weights == ew)
+			return BLI_sprintfN("effector_weights");
+	} else {
+		Object *ob= (Object*)ptr->id.data;
+		ModifierData *md;
+		
+		/* check softbody modifier */
+		md = (ModifierData *)modifiers_findByType(ob, eModifierType_Softbody);
+		if (md) {
+			/* no pointer from modifier data to actual softbody storage, would be good to add */
+			if (ob->soft->effector_weights == ew)
+				return BLI_sprintfN("modifiers[%s].settings.effector_weights", md->name);
+		}
+		
+		/* check cloth modifier */
+		md = (ModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
+		if (md) {
+			ClothModifierData *cmd = (ClothModifierData *)md;
+			
+			if (cmd->sim_parms->effector_weights == ew)
+				return BLI_sprintfN("modifiers[%s].settings.effector_weights", md->name);
+		}
+		
+		/* check smoke modifier */
+		md = (ModifierData *)modifiers_findByType(ob, eModifierType_Smoke);
+		if (md) {
+			SmokeModifierData *smd = (SmokeModifierData *)md;
+			
+			if (smd->domain->effector_weights == ew)
+				return BLI_sprintfN("modifiers[%s].settings.effector_weights", md->name);
+		}
+	}
+	return NULL;
+}
+
 static void rna_CollisionSettings_dependency_update(bContext *C, PointerRNA *ptr)
 {
 	Scene *scene= CTX_data_scene(C);
@@ -546,7 +635,7 @@
 {
 	Object *ob= NULL;
 
-	if(particle_field_check(ptr))
+	if(particle_id_check(ptr))
 		return empty_shape_items;
 	
 	ob= (Object*)ptr->id.data;
@@ -671,6 +760,7 @@
 
 	srna= RNA_def_struct(brna, "CollisionSettings", NULL);
 	RNA_def_struct_sdna(srna, "PartDeflect");
+	RNA_def_struct_path_func(srna, "rna_CollisionSettings_path");
 	RNA_def_struct_ui_text(srna, "Collision Settings", "Collision settings for object in physics simulation.");
 	
 	prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
@@ -755,6 +845,8 @@
 	PropertyRNA *prop;
 
 	srna= RNA_def_struct(brna, "EffectorWeights", NULL);
+	RNA_def_struct_sdna(srna, "EffectorWeights");
+	RNA_def_struct_path_func(srna, "rna_EffectorWeight_path");
 	RNA_def_struct_ui_text(srna, "Effector Weights", "Effector weights for physics simulation.");
 	RNA_def_struct_ui_icon(srna, ICON_PHYSICS);
 
@@ -929,6 +1021,7 @@
 
 	srna= RNA_def_struct(brna, "FieldSettings", NULL);
 	RNA_def_struct_sdna(srna, "PartDeflect");
+	RNA_def_struct_path_func(srna, "rna_FieldSettings_path");
 	RNA_def_struct_ui_text(srna, "Field Settings", "Field settings for an object in physics simulation.");
 	RNA_def_struct_ui_icon(srna, ICON_PHYSICS);
 	
@@ -1282,6 +1375,7 @@
 
 	srna= RNA_def_struct(brna, "SoftBodySettings", NULL);
 	RNA_def_struct_sdna(srna, "SoftBody");
+	RNA_def_struct_path_func(srna, "rna_SoftBodySettings_path");
 	RNA_def_struct_ui_text(srna, "Soft Body Settings", "Soft body simulation settings for an object.");
 	
 	/* General Settings */
@@ -1501,6 +1595,7 @@
 	RNA_def_property_update(prop, 0, "rna_softbody_update");
 
 	prop= RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE);
+	RNA_def_property_pointer_sdna(prop, NULL, "effector_weights");
 	RNA_def_property_struct_type(prop, "EffectorWeights");
 	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 	RNA_def_property_ui_text(prop, "Effector Weights", "");





More information about the Bf-blender-cvs mailing list