[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