Particles:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Tue, 5 Jan 2010 15:23:09 +0000 (15:23 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Tue, 5 Jan 2010 15:23:09 +0000 (15:23 +0000)
* Fix crash in mirror tool.
* Added X Mirror option back to the UI, flag is now same as the
  one for edit and paint modes, stored in the mesh.

release/scripts/ui/space_view3d_toolbar.py
source/blender/editors/physics/particle_edit.c
source/blender/makesdna/DNA_scene_types.h
source/blender/makesrna/intern/rna_sculpt_paint.c

index a9e6dcc..07500f6 100644 (file)
@@ -972,6 +972,7 @@ class VIEW3D_PT_tools_particlemode(View3DPanel):
         if not pe.hair:
             col.label(text="Correct:")
             col.prop(pe, "auto_velocity", text="Velocity")
+        col.prop(ob.data, "use_mirror_x")
 
         col = layout.column(align=True)
         col.active = pe.editable
@@ -984,7 +985,6 @@ class VIEW3D_PT_tools_particlemode(View3DPanel):
         sub.active = pe.fade_time
         sub.prop(pe, "fade_frames", slider=True)
 
-
 bpy.types.register(VIEW3D_PT_tools_weightpaint)
 bpy.types.register(VIEW3D_PT_tools_objectmode)
 bpy.types.register(VIEW3D_PT_tools_meshedit)
index eccb257..101ec22 100644 (file)
@@ -316,6 +316,14 @@ void PE_hide_keys_time(Scene *scene, PTCacheEdit *edit, float cfra)
        }
 }
 
+static int pe_x_mirror(Object *ob)
+{
+       if(ob->type == OB_MESH)
+               return (((Mesh*)ob->data)->editflag & ME_EDIT_MIRROR_X);
+       
+       return 0;
+}
+
 /****************** common struct passed to callbacks ******************/
 
 typedef struct PEData {
@@ -1185,7 +1193,7 @@ void PE_update_object(Scene *scene, Object *ob, int useflag)
        pe_iterate_lengths(scene, edit);
        pe_deflect_emitter(scene, ob, edit);
        PE_apply_lengths(scene, edit);
-       if(pset->flag & PE_X_MIRROR)
+       if(pe_x_mirror(ob))
                PE_apply_mirror(ob,edit->psys);
        if(edit->psys)
                update_world_cos(ob, edit);
@@ -1997,7 +2005,7 @@ static void rekey_particle_to_time(Scene *scene, Object *ob, int pa_index, float
 
 /************************* utilities **************************/
 
-static int remove_tagged_particles(Scene *scene, Object *ob, ParticleSystem *psys)
+static int remove_tagged_particles(Scene *scene, Object *ob, ParticleSystem *psys, int mirror)
 {
        PTCacheEdit *edit = psys->edit;
        ParticleEditSettings *pset= PE_settings(scene);
@@ -2007,7 +2015,7 @@ static int remove_tagged_particles(Scene *scene, Object *ob, ParticleSystem *psy
        ParticleSystemModifierData *psmd;
        int i, totpart, new_totpart= psys->totpart, removed= 0;
 
-       if(pset->flag & PE_X_MIRROR) {
+       if(mirror) {
                /* mirror tags */
                psmd= psys_get_modifier(ob, psys);
                totpart= psys->totpart;
@@ -2078,7 +2086,7 @@ static void remove_tagged_keys(Scene *scene, Object *ob, ParticleSystem *psys)
        ParticleSystemModifierData *psmd;
        short new_totkey;
 
-       if(pset->flag & PE_X_MIRROR) {
+       if(pe_x_mirror(ob)) {
                /* mirror key tags */
                psmd= psys_get_modifier(ob, psys);
 
@@ -2099,7 +2107,7 @@ static void remove_tagged_keys(Scene *scene, Object *ob, ParticleSystem *psys)
                if(new_totkey < 2)
                        point->flag |= PEP_TAG;
        }
-       remove_tagged_particles(scene, ob, psys);
+       remove_tagged_particles(scene, ob, psys, pe_x_mirror(ob));
 
        LOOP_POINTS {
                pa = psys->particles + p;
@@ -2270,7 +2278,7 @@ static int remove_doubles_exec(bContext *C, wmOperator *op)
        KDTreeNearest nearest[10];
        POINT_P;
        float mat[4][4], co[3], threshold= RNA_float_get(op->ptr, "threshold");
-       int n, totn, removed, flag, totremoved;
+       int n, totn, removed, totremoved;
 
        if(psys->flag & PSYS_GLOBAL_HAIR)
                return OPERATOR_CANCELLED;
@@ -2316,10 +2324,7 @@ static int remove_doubles_exec(bContext *C, wmOperator *op)
                BLI_kdtree_free(tree);
 
                /* remove tagged particles - don't do mirror here! */
-               flag= pset->flag;
-               pset->flag &= ~PE_X_MIRROR;
-               remove_tagged_particles(scene, ob, psys);
-               pset->flag= flag;
+               remove_tagged_particles(scene, ob, psys, 0);
                totremoved += removed;
        } while(removed);
 
@@ -2500,7 +2505,7 @@ static int delete_exec(bContext *C, wmOperator *op)
        }
        else if(type == DEL_PARTICLE) {
                foreach_selected_point(&data, set_delete_particle);
-               remove_tagged_particles(data.scene, data.ob, data.edit->psys);
+               remove_tagged_particles(data.scene, data.ob, data.edit->psys, pe_x_mirror(data.ob));
                recalc_lengths(data.edit);
        }
 
@@ -2603,9 +2608,11 @@ static void PE_mirror_x(Scene *scene, Object *ob, int tagged)
                newpa= psys->particles + totpart;
                newpoint= edit->points + totpart;
 
-               LOOP_VISIBLE_POINTS {
+               for(p=0, point=edit->points; p<totpart; p++, point++) {
                        pa = psys->particles + p;
 
+                       if(point->flag & PEP_HIDE)
+                               continue;
                        if(!(point->flag & PEP_TAG) || mirrorfaces[pa->num*2] == -1)
                                continue;
 
@@ -3097,7 +3104,7 @@ static int brush_add(PEData *data, short number)
                        initialize_particle(&sim, pa,i);
                        reset_particle(&sim, pa, 0.0, 1.0);
                        point->flag |= PEP_EDIT_RECALC;
-                       if(pset->flag & PE_X_MIRROR)
+                       if(pe_x_mirror(ob))
                                point->flag |= PEP_TAG; /* signal for duplicate */
                        
                        framestep= pa->lifetime/(float)(pset->totaddkey-1);
@@ -3304,7 +3311,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
                                        else
                                                foreach_point(&data, brush_cut);
 
-                                       removed= remove_tagged_particles(scene, ob, edit->psys);
+                                       removed= remove_tagged_particles(scene, ob, edit->psys, pe_x_mirror(ob));
                                        if(pset->flag & PE_KEEP_LENGTHS)
                                                recalc_lengths(edit);
                                }
@@ -3403,7 +3410,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
                        recalc_lengths(edit);
 
                if(ELEM(pset->brushtype, PE_BRUSH_ADD, PE_BRUSH_CUT) && (added || removed)) {
-                       if(pset->brushtype == PE_BRUSH_ADD && (pset->flag & PE_X_MIRROR))
+                       if(pset->brushtype == PE_BRUSH_ADD && pe_x_mirror(ob))
                                PE_mirror_x(scene, ob, 1);
 
                        update_world_cos(ob,edit);
index 6d6e668..974967c 100644 (file)
@@ -1124,7 +1124,7 @@ typedef enum SculptFlags {
 #define PE_DEFLECT_EMITTER             4
 #define PE_INTERPOLATE_ADDED   8
 #define PE_DRAW_PART                   16
-#define PE_X_MIRROR                            64
+#define PE_X_MIRROR                            64              /* deprecated */
 #define PE_FADE_TIME                   128
 #define PE_AUTO_VELOCITY               256
 
index 4d17da6..99bee94 100644 (file)
@@ -454,10 +454,6 @@ static void rna_def_particle_edit(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Draw Particles", "Draw actual particles.");
        RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
 
-       prop= RNA_def_property(srna, "mirror_x", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_X_MIRROR);
-       RNA_def_property_ui_text(prop, "X-Axis Mirror", "Mirror operations over the X axis while editing.");
-
        prop= RNA_def_property(srna, "add_interpolate", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_INTERPOLATE_ADDED);
        RNA_def_property_ui_text(prop, "Interpolate", "Interpolate new particles from the existing ones.");