[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29155] branches/soc-2010-kwk/source/ blender/editors/physics/particle_edit.c: Fixed crash when brush type "None" is selected and a particle stroke is made.

Konrad Kleine konrad at konradwilhelm.de
Wed Jun 2 13:18:20 CEST 2010


Revision: 29155
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29155
Author:   kwk
Date:     2010-06-02 13:18:19 +0200 (Wed, 02 Jun 2010)

Log Message:
-----------
Fixed crash when brush type "None" is selected and a particle stroke is made. I had to check the particle edit settings on each stroke update because brush_edit_init() only allocates a BrushEdit object if the brushtype is positive.

Modified Paths:
--------------
    branches/soc-2010-kwk/source/blender/editors/physics/particle_edit.c

Modified: branches/soc-2010-kwk/source/blender/editors/physics/particle_edit.c
===================================================================
--- branches/soc-2010-kwk/source/blender/editors/physics/particle_edit.c	2010-06-02 11:06:07 UTC (rev 29154)
+++ branches/soc-2010-kwk/source/blender/editors/physics/particle_edit.c	2010-06-02 11:18:19 UTC (rev 29155)
@@ -3312,229 +3312,239 @@
 
 static void particle_stroke_update_step(bContext *C, struct PaintStroke *stroke, PointerRNA *itemptr)
 {	
-	/* Get brushedit from paint stroke mode_data instead of wmOperator customdata. */		
-	BrushEdit *bedit = paint_stroke_mode_data(stroke);
-//	BrushEdit *bedit= op->customdata;
-	Scene *scene= bedit->scene;
-	Object *ob= bedit->ob;
-	PTCacheEdit *edit= bedit->edit;
+	// XXX (kwk) OK to get Scene from context C instead from BrushEdit?
+	Scene * scene = CTX_data_scene(C);	
 	ParticleEditSettings *pset= PE_settings(scene);
-	ParticleSystemModifierData *psmd= edit->psys ? psys_get_modifier(ob, edit->psys) : NULL;
-	ParticleBrushData *brush= &pset->brush[pset->brushtype];
-	ARegion *ar= CTX_wm_region(C);
-	float vec[3], mousef[2];
-	short mval[2], mvalo[2];
-	int flip, mouse[2], dx, dy, removed= 0, added=0, selected= 0;
-	int lock_root = pset->flag & PE_LOCK_FIRST;
-
-	if(!PE_start_edit(edit))
+	
+	if (pset->brushtype < 0) {
 		return;
-
-	RNA_float_get_array(itemptr, "mouse", mousef);	
-	/* XXX (kwk) not sure if this is the right place for adjusting mouse coordinates
-	(previously in brush_edit_apply_event) but it works. */
-	mouse[0] = mousef[0] - ar->winrct.xmin;
-	mouse[1] = mousef[1] - ar->winrct.ymin;
-	flip= RNA_boolean_get(itemptr, "flip");
-
-	if(bedit->first) {
-		bedit->lastmouse[0]= mouse[0];
-		bedit->lastmouse[1]= mouse[1];
 	}
-
-	dx= mouse[0] - bedit->lastmouse[0];
-	dy= mouse[1] - bedit->lastmouse[1];
-
-	mval[0]= mouse[0];
-	mval[1]= mouse[1];
-
-	mvalo[0]= bedit->lastmouse[0];
-	mvalo[1]= bedit->lastmouse[1];
-
-	/* disable locking temporatily for disconnected hair */
-	if(edit->psys && edit->psys->flag & PSYS_GLOBAL_HAIR)
-		pset->flag &= ~PE_LOCK_FIRST;
-
-	if(((pset->brushtype == PE_BRUSH_ADD) ?
-		(sqrt(dx * dx + dy * dy) > pset->brush[PE_BRUSH_ADD].step) : (dx != 0 || dy != 0))
-		|| bedit->first) {
-
-		view3d_operator_needs_opengl(C);
-		selected= (short)count_selected_keys(scene, edit);
-
-		switch(pset->brushtype) {
-			case PE_BRUSH_COMB:
-			{
-				PEData data;
-
-				PE_set_view3d_data(C, &data);
-				data.mval= mval;
-				data.rad= (float)brush->size;
-
-				data.combfac= (brush->strength - 0.5f) * 2.0f;
-				if(data.combfac < 0.0f)
-					data.combfac= 1.0f - 9.0f * data.combfac;
-				else
-					data.combfac= 1.0f - data.combfac;
-
-				invert_m4_m4(ob->imat, ob->obmat);
-
-				window_to_3d_delta(ar, vec, dx, dy);
-				data.dvec= vec;
-
-				foreach_mouse_hit_key(&data, brush_comb, selected);
-				break;
-			}
-			case PE_BRUSH_CUT:
-			{
-				PEData data;
-				
-				if(edit->psys && edit->pathcache) {
+	else {
+	
+		/* Get brushedit from paint stroke mode_data instead of wmOperator customdata. */		
+		BrushEdit *bedit = paint_stroke_mode_data(stroke);
+	//	BrushEdit *bedit= op->customdata;
+		
+		Object *ob= bedit->ob;
+		PTCacheEdit *edit= bedit->edit;
+		
+		ParticleSystemModifierData *psmd= edit->psys ? psys_get_modifier(ob, edit->psys) : NULL;
+		ParticleBrushData *brush= &pset->brush[pset->brushtype];
+		ARegion *ar= CTX_wm_region(C);
+		float vec[3], mousef[2];
+		short mval[2], mvalo[2];
+		int flip, mouse[2], dx, dy, removed= 0, added=0, selected= 0;
+		int lock_root = pset->flag & PE_LOCK_FIRST;
+	
+		if(!PE_start_edit(edit))
+			return;
+	
+		RNA_float_get_array(itemptr, "mouse", mousef);	
+		/* XXX (kwk) not sure if this is the right place for adjusting mouse coordinates
+		(previously in brush_edit_apply_event) but it works. */
+		mouse[0] = mousef[0] - ar->winrct.xmin;
+		mouse[1] = mousef[1] - ar->winrct.ymin;
+		flip= RNA_boolean_get(itemptr, "flip");
+	
+		if(bedit->first) {
+			bedit->lastmouse[0]= mouse[0];
+			bedit->lastmouse[1]= mouse[1];
+		}
+	
+		dx= mouse[0] - bedit->lastmouse[0];
+		dy= mouse[1] - bedit->lastmouse[1];
+	
+		mval[0]= mouse[0];
+		mval[1]= mouse[1];
+	
+		mvalo[0]= bedit->lastmouse[0];
+		mvalo[1]= bedit->lastmouse[1];
+	
+		/* disable locking temporatily for disconnected hair */
+		if(edit->psys && edit->psys->flag & PSYS_GLOBAL_HAIR)
+			pset->flag &= ~PE_LOCK_FIRST;
+	
+		if(((pset->brushtype == PE_BRUSH_ADD) ?
+			(sqrt(dx * dx + dy * dy) > pset->brush[PE_BRUSH_ADD].step) : (dx != 0 || dy != 0))
+			|| bedit->first) {
+	
+			view3d_operator_needs_opengl(C);
+			selected= (short)count_selected_keys(scene, edit);
+	
+			switch(pset->brushtype) {
+				case PE_BRUSH_COMB:
+				{
+					PEData data;
+	
 					PE_set_view3d_data(C, &data);
 					data.mval= mval;
 					data.rad= (float)brush->size;
-					data.cutfac= brush->strength;
-
-					if(selected)
-						foreach_selected_point(&data, brush_cut);
+	
+					data.combfac= (brush->strength - 0.5f) * 2.0f;
+					if(data.combfac < 0.0f)
+						data.combfac= 1.0f - 9.0f * data.combfac;
 					else
-						foreach_point(&data, brush_cut);
-
-					removed= remove_tagged_particles(scene, ob, edit->psys, pe_x_mirror(ob));
-					if(pset->flag & PE_KEEP_LENGTHS)
-						recalc_lengths(edit);
+						data.combfac= 1.0f - data.combfac;
+	
+					invert_m4_m4(ob->imat, ob->obmat);
+	
+					window_to_3d_delta(ar, vec, dx, dy);
+					data.dvec= vec;
+	
+					foreach_mouse_hit_key(&data, brush_comb, selected);
+					break;
 				}
-				else
-					removed= 0;
-
-				break;
-			}
-			case PE_BRUSH_LENGTH:
-			{
-				PEData data;
-				
-				PE_set_view3d_data(C, &data);
-				data.mval= mval;
-				
-				data.rad= (float)brush->size;
-				data.growfac= brush->strength / 50.0f;
-
-				if(brush->invert ^ flip)
-					data.growfac= 1.0f - data.growfac;
-				else
-					data.growfac= 1.0f + data.growfac;
-
-				foreach_mouse_hit_point(&data, brush_length, selected);
-
-				if(pset->flag & PE_KEEP_LENGTHS)
-					recalc_lengths(edit);
-				break;
-			}
-			case PE_BRUSH_PUFF:
-			{
-				PEData data;
-
-				if(edit->psys) {
+				case PE_BRUSH_CUT:
+				{
+					PEData data;
+					
+					if(edit->psys && edit->pathcache) {
+						PE_set_view3d_data(C, &data);
+						data.mval= mval;
+						data.rad= (float)brush->size;
+						data.cutfac= brush->strength;
+	
+						if(selected)
+							foreach_selected_point(&data, brush_cut);
+						else
+							foreach_point(&data, brush_cut);
+	
+						removed= remove_tagged_particles(scene, ob, edit->psys, pe_x_mirror(ob));
+						if(pset->flag & PE_KEEP_LENGTHS)
+							recalc_lengths(edit);
+					}
+					else
+						removed= 0;
+	
+					break;
+				}
+				case PE_BRUSH_LENGTH:
+				{
+					PEData data;
+					
 					PE_set_view3d_data(C, &data);
-					data.dm= psmd->dm;
 					data.mval= mval;
+					
 					data.rad= (float)brush->size;
-					data.select= selected;
-
-					data.pufffac= (brush->strength - 0.5f) * 2.0f;
-					if(data.pufffac < 0.0f)
-						data.pufffac= 1.0f - 9.0f * data.pufffac;
+					data.growfac= brush->strength / 50.0f;
+	
+					if(brush->invert ^ flip)
+						data.growfac= 1.0f - data.growfac;
 					else
-						data.pufffac= 1.0f - data.pufffac;
-
-					data.invert= (brush->invert ^ flip);
-					invert_m4_m4(ob->imat, ob->obmat);
-
-					foreach_mouse_hit_point(&data, brush_puff, selected);
-				}
-				break;
-			}
-			case PE_BRUSH_ADD:
-			{
-				PEData data;
-
-				if(edit->psys && edit->psys->part->from==PART_FROM_FACE) {
-					PE_set_view3d_data(C, &data);
-					data.mval= mval;
-
-					added= brush_add(&data, brush->count);
-
+						data.growfac= 1.0f + data.growfac;
+	
+					foreach_mouse_hit_point(&data, brush_length, selected);
+	
 					if(pset->flag & PE_KEEP_LENGTHS)
 						recalc_lengths(edit);
+					break;
 				}
-				else
-					added= 0;
-				break;
-			}
-			case PE_BRUSH_SMOOTH:
-			{
-				PEData data;
-
-				PE_set_view3d_data(C, &data);
-				data.mval= mval;
-				data.rad= (float)brush->size;
-
-				data.vec[0]= data.vec[1]= data.vec[2]= 0.0f;
-				data.tot= 0;
-
-				data.smoothfac= brush->strength;
-
-				invert_m4_m4(ob->imat, ob->obmat);
-
-				foreach_mouse_hit_key(&data, brush_smooth_get, selected);
-
-				if(data.tot) {
-					mul_v3_fl(data.vec, 1.0f / (float)data.tot);
-					foreach_mouse_hit_key(&data, brush_smooth_do, selected);
+				case PE_BRUSH_PUFF:
+				{
+					PEData data;
+	
+					if(edit->psys) {
+						PE_set_view3d_data(C, &data);
+						data.dm= psmd->dm;
+						data.mval= mval;
+						data.rad= (float)brush->size;
+						data.select= selected;
+	
+						data.pufffac= (brush->strength - 0.5f) * 2.0f;
+						if(data.pufffac < 0.0f)
+							data.pufffac= 1.0f - 9.0f * data.pufffac;
+						else
+							data.pufffac= 1.0f - data.pufffac;
+	
+						data.invert= (brush->invert ^ flip);
+						invert_m4_m4(ob->imat, ob->obmat);
+	
+						foreach_mouse_hit_point(&data, brush_puff, selected);
+					}
+					break;
 				}
-
-				break;
-			}
-			case PE_BRUSH_WEIGHT:
-			{
-				PEData data;
-				PE_set_view3d_data(C, &data);
-
-				if(edit->psys) {
-					data.dm= psmd->dm;
+				case PE_BRUSH_ADD:
+				{
+					PEData data;
+	
+					if(edit->psys && edit->psys->part->from==PART_FROM_FACE) {
+						PE_set_view3d_data(C, &data);
+						data.mval= mval;
+	
+						added= brush_add(&data, brush->count);
+	
+						if(pset->flag & PE_KEEP_LENGTHS)
+							recalc_lengths(edit);
+					}
+					else
+						added= 0;
+					break;
+				}
+				case PE_BRUSH_SMOOTH:
+				{
+					PEData data;
+	
+					PE_set_view3d_data(C, &data);
 					data.mval= mval;
 					data.rad= (float)brush->size;
-
-					data.weightfac = brush->strength; /* note that this will never be zero */
-
-					foreach_mouse_hit_key(&data, brush_weight, selected);
+	
+					data.vec[0]= data.vec[1]= data.vec[2]= 0.0f;
+					data.tot= 0;
+	
+					data.smoothfac= brush->strength;
+	
+					invert_m4_m4(ob->imat, ob->obmat);
+	
+					foreach_mouse_hit_key(&data, brush_smooth_get, selected);
+	
+					if(data.tot) {
+						mul_v3_fl(data.vec, 1.0f / (float)data.tot);
+						foreach_mouse_hit_key(&data, brush_smooth_do, selected);
+					}
+	
+					break;
 				}
-
-				break;
+				case PE_BRUSH_WEIGHT:
+				{
+					PEData data;
+					PE_set_view3d_data(C, &data);
+	
+					if(edit->psys) {
+						data.dm= psmd->dm;
+						data.mval= mval;
+						data.rad= (float)brush->size;
+	
+						data.weightfac = brush->strength; /* note that this will never be zero */
+	
+						foreach_mouse_hit_key(&data, brush_weight, selected);
+					}
+	
+					break;
+				}
 			}
+			if((pset->flag & PE_KEEP_LENGTHS)==0)
+				recalc_lengths(edit);
+	

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list