merge with trunk at r27259 and commit of a patch by anthony jones to fix msvc (though...
[blender-staging.git] / source / blender / editors / object / object_edit.c
index a9eb755a128a4e2fbf3223b3be18aeb384b8cd84..2e72f51bee973e1bb1b8f426f253b578cfd8032d 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
  * All rights reserved.
@@ -210,7 +210,7 @@ void OBJECT_OT_restrictview_clear(wmOperatorType *ot)
        
        /* identifiers */
        ot->name= "Clear Restrict View";
-       ot->description = "Reveal the object by setting the restrictview flag.";
+       ot->description = "Reveal the object by setting the restrictview flag";
        ot->idname= "OBJECT_OT_restrictview_clear";
        
        /* api callbacks */
@@ -262,7 +262,7 @@ void OBJECT_OT_restrictview_set(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Set Restrict View";
-       ot->description = "Hide the object by setting the restrictview flag.";
+       ot->description = "Hide the object by setting the restrictview flag";
        ot->idname= "OBJECT_OT_restrictview_set";
        
        /* api callbacks */
@@ -491,7 +491,7 @@ static int editmode_toggle_poll(bContext *C)
        Object *ob = CTX_data_active_object(C);
 
        /* covers proxies too */
-       if(ob->data==NULL || ((ID *)ob->data)->lib)
+       if(ELEM(NULL, ob, ob->data) || ((ID *)ob->data)->lib)
                return 0;
 
        return ob && (ob->type == OB_MESH || ob->type == OB_ARMATURE ||
@@ -505,7 +505,7 @@ void OBJECT_OT_editmode_toggle(wmOperatorType *ot)
        
        /* identifiers */
        ot->name= "Toggle Editmode";
-       ot->description = "Toggle object's editmode.";
+       ot->description = "Toggle object's editmode";
        ot->idname= "OBJECT_OT_editmode_toggle";
        
        /* api callbacks */
@@ -1601,6 +1601,118 @@ void copy_attr_menu(Scene *scene, View3D *v3d)
        copy_attr(scene, v3d, event);
 }
 
+/* ********************************************** */
+/* Motion Paths */
+
+/* For the object with pose/action: update paths for those that have got them
+ * This should selectively update paths that exist...
+ *
+ * To be called from various tools that do incremental updates 
+ */
+void ED_objects_recalculate_paths(bContext *C, Scene *scene)
+{
+       ListBase targets = {NULL, NULL};
+       
+       /* loop over objects in scene */
+       CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) 
+       {
+               /* set flag to force recalc, then grab the relevant bones to target */
+               ob->avs.recalc |= ANIMVIZ_RECALC_PATHS;
+               animviz_get_object_motionpaths(ob, &targets);
+       }
+       CTX_DATA_END;
+       
+       /* recalculate paths, then free */
+       animviz_calc_motionpaths(scene, &targets);
+       BLI_freelistN(&targets);
+}
+
+/* For the object with pose/action: create path curves for selected bones 
+ * This recalculates the WHOLE path within the pchan->pathsf and pchan->pathef range
+ */
+static int object_calculate_paths_exec (bContext *C, wmOperator *op)
+{
+       Scene *scene= CTX_data_scene(C);
+       
+       /* set up path data for bones being calculated */
+       CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects)  
+       {
+               /* verify makes sure that the selected bone has a bone with the appropriate settings */
+               animviz_verify_motionpaths(scene, ob, NULL);
+       }
+       CTX_DATA_END;
+       
+       /* calculate the bones that now have motionpaths... */
+       // TODO: only make for the selected bones?
+       ED_objects_recalculate_paths(C, scene);
+       
+       /* notifiers for updates */
+       WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL);
+       
+       return OPERATOR_FINISHED; 
+}
+
+void OBJECT_OT_paths_calculate (wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name= "Calculate Object Paths";
+       ot->idname= "OBJECT_OT_paths_calculate";
+       ot->description= "Calculate paths for the selected bones";
+       
+       /* api callbacks */
+       ot->exec= object_calculate_paths_exec;
+       ot->poll= ED_operator_object_active_editable;
+       
+       /* flags */
+       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* --------- */
+
+/* for the object with pose/action: clear path curves for selected bones only */
+void ED_objects_clear_paths(bContext *C, Scene *scene)
+{
+       /* loop over objects in scene */
+       CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) 
+       {
+               if (ob->mpath) {
+                       animviz_free_motionpath(ob->mpath);
+                       ob->mpath= NULL;
+               }
+       }
+       CTX_DATA_END;
+}
+
+/* operator callback for this */
+static int object_clear_paths_exec (bContext *C, wmOperator *op)
+{
+       Scene *scene= CTX_data_scene(C);
+       
+       /* use the backend function for this */
+       ED_objects_clear_paths(C, scene);
+       
+       /* notifiers for updates */
+       WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL);
+       
+       return OPERATOR_FINISHED; 
+}
+
+void OBJECT_OT_paths_clear (wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name= "Clear Object Paths";
+       ot->idname= "OBJECT_OT_paths_clear";
+       ot->description= "Clear path caches for selected bones";
+       
+       /* api callbacks */
+       ot->exec= object_clear_paths_exec;
+       ot->poll= ED_operator_object_active_editable;
+       
+       /* flags */
+       ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+
 /********************** Smooth/Flat *********************/
 
 static int shade_smooth_exec(bContext *C, wmOperator *op)
@@ -1952,7 +2064,7 @@ void OBJECT_OT_mode_set(wmOperatorType *ot)
 
        /* identifiers */
        ot->name= "Set Object Mode";
-       ot->description = "Sets the object interaction mode.";
+       ot->description = "Sets the object interaction mode";
        ot->idname= "OBJECT_OT_mode_set";
        
        /* api callbacks */
@@ -1961,7 +2073,7 @@ void OBJECT_OT_mode_set(wmOperatorType *ot)
        ot->poll= ED_operator_object_active_editable;
        
        /* flags */
-       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+       ot->flag= 0; /* no register/undo here, leave it to operators being called */
        
        prop= RNA_def_enum(ot->srna, "mode", object_mode_items, 0, "Mode", "");
        RNA_def_enum_funcs(prop, object_mode_set_itemsf);