[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49200] trunk/blender/source/blender/ editors: Fix #31419, Changing Boid-Properties impossible with pinned Particle Menu.

Lukas Toenne lukas.toenne at googlemail.com
Wed Jul 25 14:07:21 CEST 2012


Revision: 49200
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49200
Author:   lukastoenne
Date:     2012-07-25 12:07:19 +0000 (Wed, 25 Jul 2012)
Log Message:
-----------
Fix #31419, Changing Boid-Properties impossible with pinned Particle Menu.

Boid operators now retrieve the particle settings from the context directly, instead of always using the particle system (which is only needed to get to the settings anyway). When particle settings are pinned there is no particle system in the context, causing the operators to fail.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/physics/particle_boids.c
    trunk/blender/source/blender/editors/space_buttons/buttons_context.c

Modified: trunk/blender/source/blender/editors/physics/particle_boids.c
===================================================================
--- trunk/blender/source/blender/editors/physics/particle_boids.c	2012-07-25 11:26:10 UTC (rev 49199)
+++ trunk/blender/source/blender/editors/physics/particle_boids.c	2012-07-25 12:07:19 UTC (rev 49200)
@@ -56,23 +56,18 @@
 /************************ add/del boid rule operators *********************/
 static int rule_add_exec(bContext *C, wmOperator *op)
 {
-	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
-	ParticleSystem *psys= ptr.data;
-	Object *ob= ptr.id.data;
-	ParticleSettings *part;
+	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_settings", &RNA_ParticleSettings);
+	ParticleSettings *part = ptr.data;
 	int type= RNA_enum_get(op->ptr, "type");
 
 	BoidRule *rule;
 	BoidState *state;
 
-	if (!psys || !psys->part || psys->part->phystype != PART_PHYS_BOIDS)
+	if (!part || part->phystype != PART_PHYS_BOIDS)
 		return OPERATOR_CANCELLED;
 
-	part = psys->part;
-
 	state = boid_get_current_state(part->boids);
 
-
 	for (rule=state->rules.first; rule; rule=rule->next)
 		rule->flag &= ~BOIDRULE_CURRENT;
 
@@ -82,7 +77,6 @@
 	BLI_addtail(&state->rules, rule);
 
 	DAG_id_tag_update(&part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
-	WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
 	
 	return OPERATOR_FINISHED;
 }
@@ -107,25 +101,22 @@
 {
 	Main *bmain = CTX_data_main(C);
 	Scene *scene = CTX_data_scene(C);
-	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
-	ParticleSystem *psys= ptr.data;
-	Object *ob = ptr.id.data;
+	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_settings", &RNA_ParticleSettings);
+	ParticleSettings *part = ptr.data;
 	BoidRule *rule;
 	BoidState *state;
 
-	if (!psys || !psys->part || psys->part->phystype != PART_PHYS_BOIDS)
+	if (!part || part->phystype != PART_PHYS_BOIDS)
 		return OPERATOR_CANCELLED;
 
-	state = boid_get_current_state(psys->part->boids);
+	state = boid_get_current_state(part->boids);
 
-	
 	for (rule=state->rules.first; rule; rule=rule->next) {
 		if (rule->flag & BOIDRULE_CURRENT) {
 			BLI_remlink(&state->rules, rule);
 			MEM_freeN(rule);
 			break;
 		}
-
 	}
 	rule = state->rules.first;
 
@@ -133,10 +124,8 @@
 		rule->flag |= BOIDRULE_CURRENT;
 
 	DAG_scene_sort(bmain, scene);
-	DAG_id_tag_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
+	DAG_id_tag_update(&part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
 
-	WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
-	
 	return OPERATOR_FINISHED;
 }
 
@@ -157,23 +146,21 @@
 /************************ move up/down boid rule operators *********************/
 static int rule_move_up_exec(bContext *C, wmOperator *UNUSED(op))
 {
-	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
-	ParticleSystem *psys= ptr.data;
-	Object *ob = ptr.id.data;
+	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_settings", &RNA_ParticleSettings);
+	ParticleSettings *part = ptr.data;
 	BoidRule *rule;
 	BoidState *state;
 
-	if (!psys || !psys->part || psys->part->phystype != PART_PHYS_BOIDS)
+	if (!part || part->phystype != PART_PHYS_BOIDS)
 		return OPERATOR_CANCELLED;
 	
-	state = boid_get_current_state(psys->part->boids);
+	state = boid_get_current_state(part->boids);
 	for (rule = state->rules.first; rule; rule=rule->next) {
 		if (rule->flag & BOIDRULE_CURRENT && rule->prev) {
 			BLI_remlink(&state->rules, rule);
 			BLI_insertlink(&state->rules, rule->prev->prev, rule);
 
-			DAG_id_tag_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
-			WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+			DAG_id_tag_update(&part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
 			break;
 		}
 	}
@@ -195,23 +182,21 @@
 
 static int rule_move_down_exec(bContext *C, wmOperator *UNUSED(op))
 {
-	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
-	ParticleSystem *psys= ptr.data;
-	Object *ob = ptr.id.data;
+	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_settings", &RNA_ParticleSettings);
+	ParticleSettings *part = ptr.data;
 	BoidRule *rule;
 	BoidState *state;
 
-	if (!psys || !psys->part || psys->part->phystype != PART_PHYS_BOIDS)
+	if (!part || part->phystype != PART_PHYS_BOIDS)
 		return OPERATOR_CANCELLED;
 	
-	state = boid_get_current_state(psys->part->boids);
+	state = boid_get_current_state(part->boids);
 	for (rule = state->rules.first; rule; rule=rule->next) {
 		if (rule->flag & BOIDRULE_CURRENT && rule->next) {
 			BLI_remlink(&state->rules, rule);
 			BLI_insertlink(&state->rules, rule->next, rule);
 
-			DAG_id_tag_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
-			WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+			DAG_id_tag_update(&part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
 			break;
 		}
 	}
@@ -235,17 +220,13 @@
 /************************ add/del boid state operators *********************/
 static int state_add_exec(bContext *C, wmOperator *UNUSED(op))
 {
-	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
-	ParticleSystem *psys= ptr.data;
-	Object *ob= ptr.id.data;
-	ParticleSettings *part;
+	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_settings", &RNA_ParticleSettings);
+	ParticleSettings *part = ptr.data;
 	BoidState *state;
 
-	if (!psys || !psys->part || psys->part->phystype != PART_PHYS_BOIDS)
+	if (!part || part->phystype != PART_PHYS_BOIDS)
 		return OPERATOR_CANCELLED;
 
-	part = psys->part;
-
 	for (state=part->boids->states.first; state; state=state->next)
 		state->flag &= ~BOIDSTATE_CURRENT;
 
@@ -254,8 +235,6 @@
 
 	BLI_addtail(&part->boids->states, state);
 
-	WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
-	
 	return OPERATOR_FINISHED;
 }
 
@@ -276,24 +255,19 @@
 {
 	Main *bmain = CTX_data_main(C);
 	Scene *scene = CTX_data_scene(C);
-	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
-	ParticleSystem *psys= ptr.data;
-	Object *ob = ptr.id.data;
-	ParticleSettings *part;
+	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_settings", &RNA_ParticleSettings);
+	ParticleSettings *part = ptr.data;
 	BoidState *state;
 
-	if (!psys || !psys->part || psys->part->phystype != PART_PHYS_BOIDS)
+	if (!part || part->phystype != PART_PHYS_BOIDS)
 		return OPERATOR_CANCELLED;
 
-	part = psys->part;
-	
 	for (state=part->boids->states.first; state; state=state->next) {
 		if (state->flag & BOIDSTATE_CURRENT) {
 			BLI_remlink(&part->boids->states, state);
 			MEM_freeN(state);
 			break;
 		}
-
 	}
 
 	/* there must be at least one state */
@@ -307,9 +281,7 @@
 	state->flag |= BOIDSTATE_CURRENT;
 
 	DAG_scene_sort(bmain, scene);
-	DAG_id_tag_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
-
-	WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+	DAG_id_tag_update(&part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
 	
 	return OPERATOR_FINISHED;
 }
@@ -331,22 +303,20 @@
 /************************ move up/down boid state operators *********************/
 static int state_move_up_exec(bContext *C, wmOperator *UNUSED(op))
 {
-	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
-	ParticleSystem *psys= ptr.data;
-	Object *ob = ptr.id.data;
+	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_settings", &RNA_ParticleSettings);
+	ParticleSettings *part = ptr.data;
 	BoidSettings *boids;
 	BoidState *state;
 
-	if (!psys || !psys->part || psys->part->phystype != PART_PHYS_BOIDS)
+	if (!part || part->phystype != PART_PHYS_BOIDS)
 		return OPERATOR_CANCELLED;
 
-	boids = psys->part->boids;
+	boids = part->boids;
 	
 	for (state = boids->states.first; state; state=state->next) {
 		if (state->flag & BOIDSTATE_CURRENT && state->prev) {
 			BLI_remlink(&boids->states, state);
 			BLI_insertlink(&boids->states, state->prev->prev, state);
-			WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
 			break;
 		}
 	}
@@ -368,21 +338,21 @@
 
 static int state_move_down_exec(bContext *C, wmOperator *UNUSED(op))
 {
-	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
-	ParticleSystem *psys= ptr.data;
+	PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_settings", &RNA_ParticleSettings);
+	ParticleSettings *part = ptr.data;
 	BoidSettings *boids;
 	BoidState *state;
 
-	if (!psys || !psys->part || psys->part->phystype != PART_PHYS_BOIDS)
+	if (!part || part->phystype != PART_PHYS_BOIDS)
 		return OPERATOR_CANCELLED;
 
-	boids = psys->part->boids;
+	boids = part->boids;
 	
 	for (state = boids->states.first; state; state=state->next) {
 		if (state->flag & BOIDSTATE_CURRENT && state->next) {
 			BLI_remlink(&boids->states, state);
 			BLI_insertlink(&boids->states, state->next, state);
-			DAG_id_tag_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
+			DAG_id_tag_update(&part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
 			break;
 		}
 	}

Modified: trunk/blender/source/blender/editors/space_buttons/buttons_context.c
===================================================================
--- trunk/blender/source/blender/editors/space_buttons/buttons_context.c	2012-07-25 11:26:10 UTC (rev 49199)
+++ trunk/blender/source/blender/editors/space_buttons/buttons_context.c	2012-07-25 12:07:19 UTC (rev 49200)
@@ -683,7 +683,7 @@
 	"world", "object", "mesh", "armature", "lattice", "curve",
 	"meta_ball", "lamp", "speaker", "camera", "material", "material_slot",
 	"texture", "texture_slot", "texture_user", "bone", "edit_bone",
-	"pose_bone", "particle_system", "particle_system_editable",
+	"pose_bone", "particle_system", "particle_system_editable", "particle_settings",
 	"cloth", "soft_body", "fluid", "smoke", "collision", "brush", "dynamic_paint", NULL
 };
 
@@ -890,6 +890,27 @@
 			CTX_data_pointer_set(result, NULL, &RNA_ParticleSystem, NULL);
 		return 1;
 	}	
+	else if (CTX_data_equals(member, "particle_settings")) {
+		/* only available when pinned */
+		PointerRNA *ptr = get_pointer_type(path, &RNA_ParticleSettings);
+		
+		if (ptr && ptr->data) {
+			CTX_data_pointer_set(result, ptr->id.data, &RNA_ParticleSettings, ptr->data);
+			return 1;
+		}
+		else {
+			/* get settings from active particle system instead */
+			PointerRNA *ptr = get_pointer_type(path, &RNA_ParticleSystem);
+			
+			if (ptr && ptr->data) {
+				ParticleSettings *part = ((ParticleSystem *)ptr->data)->part;
+				CTX_data_pointer_set(result, ptr->id.data, &RNA_ParticleSettings, part);
+				return 1;
+			}
+		}

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list