Cleanup: remove moar G.main from BKE area.
[blender.git] / source / blender / editors / object / object_modifier.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * Contributor(s): Blender Foundation, 2009
22  *
23  * ***** END GPL LICENSE BLOCK *****
24  */
25
26 /** \file blender/editors/object/object_modifier.c
27  *  \ingroup edobj
28  */
29
30
31 #include <math.h>
32 #include <stdio.h>
33 #include <stdlib.h>
34
35 #include "MEM_guardedalloc.h"
36
37 #include "DNA_anim_types.h"
38 #include "DNA_armature_types.h"
39 #include "DNA_curve_types.h"
40 #include "DNA_key_types.h"
41 #include "DNA_mesh_types.h"
42 #include "DNA_meshdata_types.h"
43 #include "DNA_object_force_types.h"
44 #include "DNA_scene_types.h"
45
46 #include "BLI_bitmap.h"
47 #include "BLI_math.h"
48 #include "BLI_listbase.h"
49 #include "BLI_string.h"
50 #include "BLI_string_utf8.h"
51 #include "BLI_path_util.h"
52 #include "BLI_utildefines.h"
53
54 #include "BKE_animsys.h"
55 #include "BKE_curve.h"
56 #include "BKE_context.h"
57 #include "BKE_depsgraph.h"
58 #include "BKE_displist.h"
59 #include "BKE_DerivedMesh.h"
60 #include "BKE_effect.h"
61 #include "BKE_global.h"
62 #include "BKE_key.h"
63 #include "BKE_lattice.h"
64 #include "BKE_main.h"
65 #include "BKE_mesh.h"
66 #include "BKE_mesh_mapping.h"
67 #include "BKE_modifier.h"
68 #include "BKE_multires.h"
69 #include "BKE_report.h"
70 #include "BKE_object.h"
71 #include "BKE_object_deform.h"
72 #include "BKE_ocean.h"
73 #include "BKE_paint.h"
74 #include "BKE_particle.h"
75 #include "BKE_softbody.h"
76 #include "BKE_editmesh.h"
77
78 #include "RNA_access.h"
79 #include "RNA_define.h"
80 #include "RNA_enum_types.h"
81
82 #include "ED_armature.h"
83 #include "ED_object.h"
84 #include "ED_screen.h"
85 #include "ED_mesh.h"
86
87 #include "WM_api.h"
88 #include "WM_types.h"
89
90 #include "object_intern.h"
91
92 static void modifier_skin_customdata_delete(struct Object *ob);
93
94 /******************************** API ****************************/
95
96 ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *scene, Object *ob, const char *name, int type)
97 {
98         ModifierData *md = NULL, *new_md = NULL;
99         const ModifierTypeInfo *mti = modifierType_getInfo(type);
100
101         /* Check compatibility of modifier [T25291, T50373]. */
102         if (!BKE_object_support_modifier_type_check(ob, type)) {
103                 BKE_reportf(reports, RPT_WARNING, "Modifiers cannot be added to object '%s'", ob->id.name + 2);
104                 return NULL;
105         }
106
107         if (mti->flags & eModifierTypeFlag_Single) {
108                 if (modifiers_findByType(ob, type)) {
109                         BKE_report(reports, RPT_WARNING, "Only one modifier of this type is allowed");
110                         return NULL;
111                 }
112         }
113
114         if (type == eModifierType_ParticleSystem) {
115                 /* don't need to worry about the new modifier's name, since that is set to the number
116                  * of particle systems which shouldn't have too many duplicates
117                  */
118                 new_md = object_add_particle_system(scene, ob, name);
119         }
120         else {
121                 /* get new modifier data to add */
122                 new_md = modifier_new(type);
123
124                 if (mti->flags & eModifierTypeFlag_RequiresOriginalData) {
125                         md = ob->modifiers.first;
126
127                         while (md && modifierType_getInfo(md->type)->type == eModifierTypeType_OnlyDeform)
128                                 md = md->next;
129
130                         BLI_insertlinkbefore(&ob->modifiers, md, new_md);
131                 }
132                 else
133                         BLI_addtail(&ob->modifiers, new_md);
134
135                 if (name) {
136                         BLI_strncpy_utf8(new_md->name, name, sizeof(new_md->name));
137                 }
138
139                 /* make sure modifier data has unique name */
140
141                 modifier_unique_name(&ob->modifiers, new_md);
142
143                 /* special cases */
144                 if (type == eModifierType_Softbody) {
145                         if (!ob->soft) {
146                                 ob->soft = sbNew(scene);
147                                 ob->softflag |= OB_SB_GOAL | OB_SB_EDGES;
148                         }
149                 }
150                 else if (type == eModifierType_Collision) {
151                         if (!ob->pd)
152                                 ob->pd = object_add_collision_fields(0);
153
154                         ob->pd->deflect = 1;
155                 }
156                 else if (type == eModifierType_Surface) {
157                         /* pass */
158                 }
159                 else if (type == eModifierType_Multires) {
160                         /* set totlvl from existing MDISPS layer if object already had it */
161                         multiresModifier_set_levels_from_disps((MultiresModifierData *)new_md, ob);
162
163                         if (ob->mode & OB_MODE_SCULPT) {
164                                 /* ensure that grid paint mask layer is created */
165                                 BKE_sculpt_mask_layers_ensure(ob, (MultiresModifierData *)new_md);
166                         }
167                 }
168                 else if (type == eModifierType_Skin) {
169                         /* ensure skin-node customdata exists */
170                         BKE_mesh_ensure_skin_customdata(ob->data);
171                 }
172         }
173
174         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
175         DAG_relations_tag_update(bmain);
176
177         return new_md;
178 }
179
180 /* Return true if the object has a modifier of type 'type' other than
181  * the modifier pointed to be 'exclude', otherwise returns false. */
182 static bool object_has_modifier(const Object *ob, const ModifierData *exclude,
183                                 ModifierType type)
184 {
185         ModifierData *md;
186
187         for (md = ob->modifiers.first; md; md = md->next) {
188                 if ((md != exclude) && (md->type == type))
189                         return true;
190         }
191
192         return false;
193 }
194
195 /* If the object data of 'orig_ob' has other users, run 'callback' on
196  * each of them.
197  *
198  * If include_orig is true, the callback will run on 'orig_ob' too.
199  *
200  * If the callback ever returns true, iteration will stop and the
201  * function value will be true. Otherwise the function returns false.
202  */
203 bool ED_object_iter_other(Main *bmain, Object *orig_ob, const bool include_orig,
204                           bool (*callback)(Object *ob, void *callback_data),
205                           void *callback_data)
206 {
207         ID *ob_data_id = orig_ob->data;
208         int users = ob_data_id->us;
209
210         if (ob_data_id->flag & LIB_FAKEUSER)
211                 users--;
212
213         /* First check that the object's data has multiple users */
214         if (users > 1) {
215                 Object *ob;
216                 int totfound = include_orig ? 0 : 1;
217
218                 for (ob = bmain->object.first; ob && totfound < users;
219                      ob = ob->id.next)
220                 {
221                         if (((ob != orig_ob) || include_orig) &&
222                             (ob->data == orig_ob->data))
223                         {
224                                 if (callback(ob, callback_data))
225                                         return true;
226
227                                 totfound++;
228                         }
229                 }
230         }
231         else if (include_orig) {
232                 return callback(orig_ob, callback_data);
233         }
234
235         return false;
236 }
237
238 static bool object_has_modifier_cb(Object *ob, void *data)
239 {
240         ModifierType type = *((ModifierType *)data);
241
242         return object_has_modifier(ob, NULL, type);
243 }
244
245 /* Use with ED_object_iter_other(). Sets the total number of levels
246  * for any multires modifiers on the object to the int pointed to by
247  * callback_data. */
248 bool ED_object_multires_update_totlevels_cb(Object *ob, void *totlevel_v)
249 {
250         ModifierData *md;
251         int totlevel = *((char *)totlevel_v);
252
253         for (md = ob->modifiers.first; md; md = md->next) {
254                 if (md->type == eModifierType_Multires) {
255                         multires_set_tot_level(ob, (MultiresModifierData *)md, totlevel);
256                         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
257                 }
258         }
259         return false;
260 }
261
262 /* Return true if no modifier of type 'type' other than 'exclude' */
263 static bool object_modifier_safe_to_delete(Main *bmain, Object *ob,
264                                            ModifierData *exclude,
265                                            ModifierType type)
266 {
267         return (!object_has_modifier(ob, exclude, type) &&
268                 !ED_object_iter_other(bmain, ob, false,
269                                       object_has_modifier_cb, &type));
270 }
271
272 static bool object_modifier_remove(Main *bmain, Object *ob, ModifierData *md,
273                                    bool *r_sort_depsgraph)
274 {
275         /* It seems on rapid delete it is possible to
276          * get called twice on same modifier, so make
277          * sure it is in list. */
278         if (BLI_findindex(&ob->modifiers, md) == -1) {
279                 return 0;
280         }
281
282         /* special cases */
283         if (md->type == eModifierType_ParticleSystem) {
284                 ParticleSystemModifierData *psmd = (ParticleSystemModifierData *)md;
285
286                 BLI_remlink(&ob->particlesystem, psmd->psys);
287                 psys_free(ob, psmd->psys);
288                 psmd->psys = NULL;
289         }
290         else if (md->type == eModifierType_Softbody) {
291                 if (ob->soft) {
292                         sbFree(ob->soft);
293                         ob->soft = NULL;
294                         ob->softflag = 0;
295                 }
296         }
297         else if (md->type == eModifierType_Collision) {
298                 if (ob->pd)
299                         ob->pd->deflect = 0;
300
301                 *r_sort_depsgraph = true;
302         }
303         else if (md->type == eModifierType_Surface) {
304                 *r_sort_depsgraph = true;
305         }
306         else if (md->type == eModifierType_Multires) {
307                 /* Delete MDisps layer if not used by another multires modifier */
308                 if (object_modifier_safe_to_delete(bmain, ob, md, eModifierType_Multires))
309                         multires_customdata_delete(ob->data);
310         }
311         else if (md->type == eModifierType_Skin) {
312                 /* Delete MVertSkin layer if not used by another skin modifier */
313                 if (object_modifier_safe_to_delete(bmain, ob, md, eModifierType_Skin))
314                         modifier_skin_customdata_delete(ob);
315         }
316
317         if (ELEM(md->type, eModifierType_Softbody, eModifierType_Cloth) &&
318             BLI_listbase_is_empty(&ob->particlesystem))
319         {
320                 ob->mode &= ~OB_MODE_PARTICLE_EDIT;
321         }
322
323         DAG_relations_tag_update(bmain);
324
325         BLI_remlink(&ob->modifiers, md);
326         modifier_free(md);
327         BKE_object_free_derived_caches(ob);
328
329         return 1;
330 }
331
332 bool ED_object_modifier_remove(ReportList *reports, Main *bmain, Object *ob, ModifierData *md)
333 {
334         bool sort_depsgraph = false;
335         bool ok;
336
337         ok = object_modifier_remove(bmain, ob, md, &sort_depsgraph);
338
339         if (!ok) {
340                 BKE_reportf(reports, RPT_ERROR, "Modifier '%s' not in object '%s'", md->name, ob->id.name);
341                 return 0;
342         }
343
344         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
345         DAG_relations_tag_update(bmain);
346
347         return 1;
348 }
349
350 void ED_object_modifier_clear(Main *bmain, Object *ob)
351 {
352         ModifierData *md = ob->modifiers.first;
353         bool sort_depsgraph = false;
354
355         if (!md)
356                 return;
357
358         while (md) {
359                 ModifierData *next_md;
360
361                 next_md = md->next;
362
363                 object_modifier_remove(bmain, ob, md, &sort_depsgraph);
364
365                 md = next_md;
366         }
367
368         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
369         DAG_relations_tag_update(bmain);
370 }
371
372 int ED_object_modifier_move_up(ReportList *reports, Object *ob, ModifierData *md)
373 {
374         if (md->prev) {
375                 const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
376
377                 if (mti->type != eModifierTypeType_OnlyDeform) {
378                         const ModifierTypeInfo *nmti = modifierType_getInfo(md->prev->type);
379
380                         if (nmti->flags & eModifierTypeFlag_RequiresOriginalData) {
381                                 BKE_report(reports, RPT_WARNING, "Cannot move above a modifier requiring original data");
382                                 return 0;
383                         }
384                 }
385
386                 BLI_remlink(&ob->modifiers, md);
387                 BLI_insertlinkbefore(&ob->modifiers, md->prev, md);
388         }
389
390         return 1;
391 }
392
393 int ED_object_modifier_move_down(ReportList *reports, Object *ob, ModifierData *md)
394 {
395         if (md->next) {
396                 const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
397
398                 if (mti->flags & eModifierTypeFlag_RequiresOriginalData) {
399                         const ModifierTypeInfo *nmti = modifierType_getInfo(md->next->type);
400
401                         if (nmti->type != eModifierTypeType_OnlyDeform) {
402                                 BKE_report(reports, RPT_WARNING, "Cannot move beyond a non-deforming modifier");
403                                 return 0;
404                         }
405                 }
406
407                 BLI_remlink(&ob->modifiers, md);
408                 BLI_insertlinkafter(&ob->modifiers, md->next, md);
409         }
410
411         return 1;
412 }
413
414 int ED_object_modifier_convert(ReportList *UNUSED(reports), Main *bmain, Scene *scene, Object *ob, ModifierData *md)
415 {
416         Object *obn;
417         ParticleSystem *psys;
418         ParticleCacheKey *key, **cache;
419         ParticleSettings *part;
420         Mesh *me;
421         MVert *mvert;
422         MEdge *medge;
423         int a, k, kmax;
424         int totvert = 0, totedge = 0, cvert = 0;
425         int totpart = 0, totchild = 0;
426
427         if (md->type != eModifierType_ParticleSystem) return 0;
428         if (ob && ob->mode & OB_MODE_PARTICLE_EDIT) return 0;
429
430         psys = ((ParticleSystemModifierData *)md)->psys;
431         part = psys->part;
432
433         if (part->ren_as != PART_DRAW_PATH || psys->pathcache == NULL)
434                 return 0;
435
436         totpart = psys->totcached;
437         totchild = psys->totchildcache;
438
439         if (totchild && (part->draw & PART_DRAW_PARENT) == 0)
440                 totpart = 0;
441
442         /* count */
443         cache = psys->pathcache;
444         for (a = 0; a < totpart; a++) {
445                 key = cache[a];
446
447                 if (key->segments > 0) {
448                         totvert += key->segments + 1;
449                         totedge += key->segments;
450                 }
451         }
452
453         cache = psys->childcache;
454         for (a = 0; a < totchild; a++) {
455                 key = cache[a];
456
457                 if (key->segments > 0) {
458                         totvert += key->segments + 1;
459                         totedge += key->segments;
460                 }
461         }
462
463         if (totvert == 0) return 0;
464
465         /* add new mesh */
466         obn = BKE_object_add(bmain, scene, OB_MESH, NULL);
467         me = obn->data;
468
469         me->totvert = totvert;
470         me->totedge = totedge;
471
472         me->mvert = CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, totvert);
473         me->medge = CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, totedge);
474         me->mface = CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, 0);
475
476         mvert = me->mvert;
477         medge = me->medge;
478
479         /* copy coordinates */
480         cache = psys->pathcache;
481         for (a = 0; a < totpart; a++) {
482                 key = cache[a];
483                 kmax = key->segments;
484                 for (k = 0; k <= kmax; k++, key++, cvert++, mvert++) {
485                         copy_v3_v3(mvert->co, key->co);
486                         if (k) {
487                                 medge->v1 = cvert - 1;
488                                 medge->v2 = cvert;
489                                 medge->flag = ME_EDGEDRAW | ME_EDGERENDER | ME_LOOSEEDGE;
490                                 medge++;
491                         }
492                         else {
493                                 /* cheap trick to select the roots */
494                                 mvert->flag |= SELECT;
495                         }
496                 }
497         }
498
499         cache = psys->childcache;
500         for (a = 0; a < totchild; a++) {
501                 key = cache[a];
502                 kmax = key->segments;
503                 for (k = 0; k <= kmax; k++, key++, cvert++, mvert++) {
504                         copy_v3_v3(mvert->co, key->co);
505                         if (k) {
506                                 medge->v1 = cvert - 1;
507                                 medge->v2 = cvert;
508                                 medge->flag = ME_EDGEDRAW | ME_EDGERENDER | ME_LOOSEEDGE;
509                                 medge++;
510                         }
511                         else {
512                                 /* cheap trick to select the roots */
513                                 mvert->flag |= SELECT;
514                         }
515                 }
516         }
517
518         DAG_relations_tag_update(bmain);
519
520         return 1;
521 }
522
523 static int modifier_apply_shape(Main *bmain, ReportList *reports, Scene *scene, Object *ob, ModifierData *md)
524 {
525         const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
526
527         md->scene = scene;
528
529         if (mti->isDisabled && mti->isDisabled(md, 0)) {
530                 BKE_report(reports, RPT_ERROR, "Modifier is disabled, skipping apply");
531                 return 0;
532         }
533
534         /*
535          * It should be ridiculously easy to extract the original verts that we want
536          * and form the shape data.  We can probably use the CD KEYINDEX layer (or
537          * whatever I ended up calling it, too tired to check now), though this would
538          * by necessity have to make some potentially ugly assumptions about the order
539          * of the mesh data :-/  you can probably assume in 99% of cases that the first
540          * element of a given index is the original, and any subsequent duplicates are
541          * copies/interpolates, but that's an assumption that would need to be tested
542          * and then predominantly stated in comments in a half dozen headers.
543          */
544
545         if (ob->type == OB_MESH) {
546                 DerivedMesh *dm;
547                 Mesh *me = ob->data;
548                 Key *key = me->key;
549                 KeyBlock *kb;
550
551                 if (!modifier_isSameTopology(md) || mti->type == eModifierTypeType_NonGeometrical) {
552                         BKE_report(reports, RPT_ERROR, "Only deforming modifiers can be applied to shapes");
553                         return 0;
554                 }
555
556                 dm = mesh_create_derived_for_modifier(scene, ob, md, 0);
557                 if (!dm) {
558                         BKE_report(reports, RPT_ERROR, "Modifier is disabled or returned error, skipping apply");
559                         return 0;
560                 }
561
562                 if (key == NULL) {
563                         key = me->key = BKE_key_add(bmain, (ID *)me);
564                         key->type = KEY_RELATIVE;
565                         /* if that was the first key block added, then it was the basis.
566                          * Initialize it with the mesh, and add another for the modifier */
567                         kb = BKE_keyblock_add(key, NULL);
568                         BKE_keyblock_convert_from_mesh(me, kb);
569                 }
570
571                 kb = BKE_keyblock_add(key, md->name);
572                 DM_to_meshkey(dm, me, kb);
573
574                 dm->release(dm);
575         }
576         else {
577                 BKE_report(reports, RPT_ERROR, "Cannot apply modifier for this object type");
578                 return 0;
579         }
580         return 1;
581 }
582
583 static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob, ModifierData *md)
584 {
585         const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
586
587         md->scene = scene;
588
589         if (mti->isDisabled && mti->isDisabled(md, 0)) {
590                 BKE_report(reports, RPT_ERROR, "Modifier is disabled, skipping apply");
591                 return 0;
592         }
593
594         if (ob->type == OB_MESH) {
595                 DerivedMesh *dm;
596                 Mesh *me = ob->data;
597                 MultiresModifierData *mmd = find_multires_modifier_before(scene, md);
598
599                 if (me->key && mti->type != eModifierTypeType_NonGeometrical) {
600                         BKE_report(reports, RPT_ERROR, "Modifier cannot be applied to a mesh with shape keys");
601                         return 0;
602                 }
603
604                 /* Multires: ensure that recent sculpting is applied */
605                 if (md->type == eModifierType_Multires)
606                         multires_force_update(ob);
607
608                 if (mmd && mmd->totlvl && mti->type == eModifierTypeType_OnlyDeform) {
609                         if (!multiresModifier_reshapeFromDeformMod(scene, mmd, ob, md)) {
610                                 BKE_report(reports, RPT_ERROR, "Multires modifier returned error, skipping apply");
611                                 return 0;
612                         }
613                 }
614                 else {
615                         dm = mesh_create_derived_for_modifier(scene, ob, md, 1);
616                         if (!dm) {
617                                 BKE_report(reports, RPT_ERROR, "Modifier returned error, skipping apply");
618                                 return 0;
619                         }
620
621                         DM_to_mesh(dm, me, ob, CD_MASK_MESH, true);
622
623                         if (md->type == eModifierType_Multires)
624                                 multires_customdata_delete(me);
625                 }
626         }
627         else if (ELEM(ob->type, OB_CURVE, OB_SURF)) {
628                 Curve *cu;
629                 int numVerts;
630                 float (*vertexCos)[3];
631
632                 if (ELEM(mti->type, eModifierTypeType_Constructive, eModifierTypeType_Nonconstructive)) {
633                         BKE_report(reports, RPT_ERROR, "Cannot apply constructive modifiers on curve");
634                         return 0;
635                 }
636
637                 cu = ob->data;
638                 BKE_report(reports, RPT_INFO, "Applied modifier only changed CV points, not tessellated/bevel vertices");
639
640                 vertexCos = BKE_curve_nurbs_vertexCos_get(&cu->nurb, &numVerts);
641                 mti->deformVerts(md, ob, NULL, vertexCos, numVerts, 0);
642                 BK_curve_nurbs_vertexCos_apply(&cu->nurb, vertexCos);
643
644                 MEM_freeN(vertexCos);
645
646                 DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
647         }
648         else {
649                 BKE_report(reports, RPT_ERROR, "Cannot apply modifier for this object type");
650                 return 0;
651         }
652
653         /* lattice modifier can be applied to particle system too */
654         if (ob->particlesystem.first) {
655
656                 ParticleSystem *psys = ob->particlesystem.first;
657
658                 for (; psys; psys = psys->next) {
659
660                         if (psys->part->type != PART_HAIR)
661                                 continue;
662
663                         psys_apply_hair_lattice(scene, ob, psys);
664                 }
665         }
666
667         return 1;
668 }
669
670 int ED_object_modifier_apply(Main *bmain, ReportList *reports, Scene *scene, Object *ob, ModifierData *md, int mode)
671 {
672         int prev_mode;
673
674         if (scene->obedit) {
675                 BKE_report(reports, RPT_ERROR, "Modifiers cannot be applied in edit mode");
676                 return 0;
677         }
678         else if (((ID *) ob->data)->us > 1) {
679                 BKE_report(reports, RPT_ERROR, "Modifiers cannot be applied to multi-user data");
680                 return 0;
681         }
682         else if ((ob->mode & OB_MODE_SCULPT) &&
683                  (find_multires_modifier_before(scene, md)) &&
684                  (modifier_isSameTopology(md) == false))
685         {
686                 BKE_report(reports, RPT_ERROR, "Constructive modifier cannot be applied to multi-res data in sculpt mode");
687                 return 0;
688         }
689
690         if (md != ob->modifiers.first)
691                 BKE_report(reports, RPT_INFO, "Applied modifier was not first, result may not be as expected");
692
693         /* allow apply of a not-realtime modifier, by first re-enabling realtime. */
694         prev_mode = md->mode;
695         md->mode |= eModifierMode_Realtime;
696
697         if (mode == MODIFIER_APPLY_SHAPE) {
698                 if (!modifier_apply_shape(bmain, reports, scene, ob, md)) {
699                         md->mode = prev_mode;
700                         return 0;
701                 }
702         }
703         else {
704                 if (!modifier_apply_obdata(reports, scene, ob, md)) {
705                         md->mode = prev_mode;
706                         return 0;
707                 }
708         }
709
710         BLI_remlink(&ob->modifiers, md);
711         modifier_free(md);
712
713         BKE_object_free_derived_caches(ob);
714
715         return 1;
716 }
717
718 int ED_object_modifier_copy(ReportList *UNUSED(reports), Object *ob, ModifierData *md)
719 {
720         ModifierData *nmd;
721
722         nmd = modifier_new(md->type);
723         modifier_copyData(md, nmd);
724         BLI_insertlinkafter(&ob->modifiers, md, nmd);
725         modifier_unique_name(&ob->modifiers, nmd);
726
727         return 1;
728 }
729
730 /************************ add modifier operator *********************/
731
732 static int modifier_add_exec(bContext *C, wmOperator *op)
733 {
734         Main *bmain = CTX_data_main(C);
735         Scene *scene = CTX_data_scene(C);
736         Object *ob = ED_object_active_context(C);
737         int type = RNA_enum_get(op->ptr, "type");
738
739         if (!ED_object_modifier_add(op->reports, bmain, scene, ob, NULL, type))
740                 return OPERATOR_CANCELLED;
741
742         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
743
744         return OPERATOR_FINISHED;
745 }
746
747 static const EnumPropertyItem *modifier_add_itemf(
748         bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free)
749 {
750         Object *ob = ED_object_active_context(C);
751         EnumPropertyItem *item = NULL;
752         const EnumPropertyItem *md_item, *group_item = NULL;
753         const ModifierTypeInfo *mti;
754         int totitem = 0, a;
755
756         if (!ob)
757                 return rna_enum_object_modifier_type_items;
758
759         for (a = 0; rna_enum_object_modifier_type_items[a].identifier; a++) {
760                 md_item = &rna_enum_object_modifier_type_items[a];
761
762                 if (md_item->identifier[0]) {
763                         mti = modifierType_getInfo(md_item->value);
764
765                         if (mti->flags & eModifierTypeFlag_NoUserAdd)
766                                 continue;
767
768                         if (!BKE_object_support_modifier_type_check(ob, md_item->value))
769                                 continue;
770                 }
771                 else {
772                         group_item = md_item;
773                         md_item = NULL;
774
775                         continue;
776                 }
777
778                 if (group_item) {
779                         RNA_enum_item_add(&item, &totitem, group_item);
780                         group_item = NULL;
781                 }
782
783                 RNA_enum_item_add(&item, &totitem, md_item);
784         }
785
786         RNA_enum_item_end(&item, &totitem);
787         *r_free = true;
788
789         return item;
790 }
791
792 void OBJECT_OT_modifier_add(wmOperatorType *ot)
793 {
794         PropertyRNA *prop;
795
796         /* identifiers */
797         ot->name = "Add Modifier";
798         ot->description = "Add a procedural operation/effect to the active object";
799         ot->idname = "OBJECT_OT_modifier_add";
800
801         /* api callbacks */
802         ot->invoke = WM_menu_invoke;
803         ot->exec = modifier_add_exec;
804         ot->poll = ED_operator_object_active_editable;
805
806         /* flags */
807         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
808
809         /* properties */
810         prop = RNA_def_enum(ot->srna, "type", rna_enum_object_modifier_type_items, eModifierType_Subsurf, "Type", "");
811         RNA_def_enum_funcs(prop, modifier_add_itemf);
812         ot->prop = prop;
813 }
814
815 /************************ generic functions for operators using mod names and data context *********************/
816
817 int edit_modifier_poll_generic(bContext *C, StructRNA *rna_type, int obtype_flag)
818 {
819         PointerRNA ptr = CTX_data_pointer_get_type(C, "modifier", rna_type);
820         Object *ob = (ptr.id.data) ? ptr.id.data : ED_object_active_context(C);
821
822         if (!ob || ID_IS_LINKED(ob)) return 0;
823         if (obtype_flag && ((1 << ob->type) & obtype_flag) == 0) return 0;
824         if (ptr.id.data && ID_IS_LINKED(ptr.id.data)) return 0;
825
826         return 1;
827 }
828
829 int edit_modifier_poll(bContext *C)
830 {
831         return edit_modifier_poll_generic(C, &RNA_Modifier, 0);
832 }
833
834 void edit_modifier_properties(wmOperatorType *ot)
835 {
836         RNA_def_string(ot->srna, "modifier", NULL, MAX_NAME, "Modifier", "Name of the modifier to edit");
837 }
838
839 int edit_modifier_invoke_properties(bContext *C, wmOperator *op)
840 {
841         ModifierData *md;
842
843         if (RNA_struct_property_is_set(op->ptr, "modifier")) {
844                 return true;
845         }
846         else {
847                 PointerRNA ptr = CTX_data_pointer_get_type(C, "modifier", &RNA_Modifier);
848                 if (ptr.data) {
849                         md = ptr.data;
850                         RNA_string_set(op->ptr, "modifier", md->name);
851                         return true;
852                 }
853         }
854
855         return false;
856 }
857
858 ModifierData *edit_modifier_property_get(wmOperator *op, Object *ob, int type)
859 {
860         char modifier_name[MAX_NAME];
861         ModifierData *md;
862         RNA_string_get(op->ptr, "modifier", modifier_name);
863
864         md = modifiers_findByName(ob, modifier_name);
865
866         if (md && type != 0 && md->type != type)
867                 md = NULL;
868
869         return md;
870 }
871
872 /************************ remove modifier operator *********************/
873
874 static int modifier_remove_exec(bContext *C, wmOperator *op)
875 {
876         Main *bmain = CTX_data_main(C);
877         Scene *scene = CTX_data_scene(C);
878         Object *ob = ED_object_active_context(C);
879         ModifierData *md = edit_modifier_property_get(op, ob, 0);
880         int mode_orig = ob->mode;
881
882         if (!md || !ED_object_modifier_remove(op->reports, bmain, ob, md))
883                 return OPERATOR_CANCELLED;
884
885         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
886
887         /* if cloth/softbody was removed, particle mode could be cleared */
888         if (mode_orig & OB_MODE_PARTICLE_EDIT)
889                 if ((ob->mode & OB_MODE_PARTICLE_EDIT) == 0)
890                         if (scene->basact && scene->basact->object == ob)
891                                 WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_OBJECT, NULL);
892
893         return OPERATOR_FINISHED;
894 }
895
896 static int modifier_remove_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
897 {
898         if (edit_modifier_invoke_properties(C, op))
899                 return modifier_remove_exec(C, op);
900         else
901                 return OPERATOR_CANCELLED;
902 }
903
904 void OBJECT_OT_modifier_remove(wmOperatorType *ot)
905 {
906         ot->name = "Remove Modifier";
907         ot->description = "Remove a modifier from the active object";
908         ot->idname = "OBJECT_OT_modifier_remove";
909
910         ot->invoke = modifier_remove_invoke;
911         ot->exec = modifier_remove_exec;
912         ot->poll = edit_modifier_poll;
913
914         /* flags */
915         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
916         edit_modifier_properties(ot);
917 }
918
919 /************************ move up modifier operator *********************/
920
921 static int modifier_move_up_exec(bContext *C, wmOperator *op)
922 {
923         Object *ob = ED_object_active_context(C);
924         ModifierData *md = edit_modifier_property_get(op, ob, 0);
925
926         if (!md || !ED_object_modifier_move_up(op->reports, ob, md))
927                 return OPERATOR_CANCELLED;
928
929         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
930         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
931
932         return OPERATOR_FINISHED;
933 }
934
935 static int modifier_move_up_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
936 {
937         if (edit_modifier_invoke_properties(C, op))
938                 return modifier_move_up_exec(C, op);
939         else
940                 return OPERATOR_CANCELLED;
941 }
942
943 void OBJECT_OT_modifier_move_up(wmOperatorType *ot)
944 {
945         ot->name = "Move Up Modifier";
946         ot->description = "Move modifier up in the stack";
947         ot->idname = "OBJECT_OT_modifier_move_up";
948
949         ot->invoke = modifier_move_up_invoke;
950         ot->exec = modifier_move_up_exec;
951         ot->poll = edit_modifier_poll;
952
953         /* flags */
954         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
955         edit_modifier_properties(ot);
956 }
957
958 /************************ move down modifier operator *********************/
959
960 static int modifier_move_down_exec(bContext *C, wmOperator *op)
961 {
962         Object *ob = ED_object_active_context(C);
963         ModifierData *md = edit_modifier_property_get(op, ob, 0);
964
965         if (!md || !ED_object_modifier_move_down(op->reports, ob, md))
966                 return OPERATOR_CANCELLED;
967
968         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
969         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
970
971         return OPERATOR_FINISHED;
972 }
973
974 static int modifier_move_down_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
975 {
976         if (edit_modifier_invoke_properties(C, op))
977                 return modifier_move_down_exec(C, op);
978         else
979                 return OPERATOR_CANCELLED;
980 }
981
982 void OBJECT_OT_modifier_move_down(wmOperatorType *ot)
983 {
984         ot->name = "Move Down Modifier";
985         ot->description = "Move modifier down in the stack";
986         ot->idname = "OBJECT_OT_modifier_move_down";
987
988         ot->invoke = modifier_move_down_invoke;
989         ot->exec = modifier_move_down_exec;
990         ot->poll = edit_modifier_poll;
991
992         /* flags */
993         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
994         edit_modifier_properties(ot);
995 }
996
997 /************************ apply modifier operator *********************/
998
999 static int modifier_apply_exec(bContext *C, wmOperator *op)
1000 {
1001         Main *bmain = CTX_data_main(C);
1002         Scene *scene = CTX_data_scene(C);
1003         Object *ob = ED_object_active_context(C);
1004         ModifierData *md = edit_modifier_property_get(op, ob, 0);
1005         int apply_as = RNA_enum_get(op->ptr, "apply_as");
1006
1007         if (!md || !ED_object_modifier_apply(bmain, op->reports, scene, ob, md, apply_as)) {
1008                 return OPERATOR_CANCELLED;
1009         }
1010
1011         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
1012         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
1013
1014         return OPERATOR_FINISHED;
1015 }
1016
1017 static int modifier_apply_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
1018 {
1019         if (edit_modifier_invoke_properties(C, op))
1020                 return modifier_apply_exec(C, op);
1021         else
1022                 return OPERATOR_CANCELLED;
1023 }
1024
1025 static const EnumPropertyItem modifier_apply_as_items[] = {
1026         {MODIFIER_APPLY_DATA, "DATA", 0, "Object Data", "Apply modifier to the object's data"},
1027         {MODIFIER_APPLY_SHAPE, "SHAPE", 0, "New Shape", "Apply deform-only modifier to a new shape on this object"},
1028         {0, NULL, 0, NULL, NULL}
1029 };
1030
1031 void OBJECT_OT_modifier_apply(wmOperatorType *ot)
1032 {
1033         ot->name = "Apply Modifier";
1034         ot->description = "Apply modifier and remove from the stack";
1035         ot->idname = "OBJECT_OT_modifier_apply";
1036
1037         ot->invoke = modifier_apply_invoke;
1038         ot->exec = modifier_apply_exec;
1039         ot->poll = edit_modifier_poll;
1040
1041         /* flags */
1042         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
1043
1044         RNA_def_enum(ot->srna, "apply_as", modifier_apply_as_items, MODIFIER_APPLY_DATA, "Apply as", "How to apply the modifier to the geometry");
1045         edit_modifier_properties(ot);
1046 }
1047
1048 /************************ convert modifier operator *********************/
1049
1050 static int modifier_convert_exec(bContext *C, wmOperator *op)
1051 {
1052         Main *bmain = CTX_data_main(C);
1053         Scene *scene = CTX_data_scene(C);
1054         Object *ob = ED_object_active_context(C);
1055         ModifierData *md = edit_modifier_property_get(op, ob, 0);
1056
1057         if (!md || !ED_object_modifier_convert(op->reports, bmain, scene, ob, md))
1058                 return OPERATOR_CANCELLED;
1059
1060         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
1061         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
1062
1063         return OPERATOR_FINISHED;
1064 }
1065
1066 static int modifier_convert_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
1067 {
1068         if (edit_modifier_invoke_properties(C, op))
1069                 return modifier_convert_exec(C, op);
1070         else
1071                 return OPERATOR_CANCELLED;
1072 }
1073
1074 void OBJECT_OT_modifier_convert(wmOperatorType *ot)
1075 {
1076         ot->name = "Convert Modifier";
1077         ot->description = "Convert particles to a mesh object";
1078         ot->idname = "OBJECT_OT_modifier_convert";
1079
1080         ot->invoke = modifier_convert_invoke;
1081         ot->exec = modifier_convert_exec;
1082         ot->poll = edit_modifier_poll;
1083
1084         /* flags */
1085         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
1086         edit_modifier_properties(ot);
1087 }
1088
1089 /************************ copy modifier operator *********************/
1090
1091 static int modifier_copy_exec(bContext *C, wmOperator *op)
1092 {
1093         Object *ob = ED_object_active_context(C);
1094         ModifierData *md = edit_modifier_property_get(op, ob, 0);
1095
1096         if (!md || !ED_object_modifier_copy(op->reports, ob, md))
1097                 return OPERATOR_CANCELLED;
1098
1099         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
1100         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
1101
1102         return OPERATOR_FINISHED;
1103 }
1104
1105 static int modifier_copy_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
1106 {
1107         if (edit_modifier_invoke_properties(C, op))
1108                 return modifier_copy_exec(C, op);
1109         else
1110                 return OPERATOR_CANCELLED;
1111 }
1112
1113 void OBJECT_OT_modifier_copy(wmOperatorType *ot)
1114 {
1115         ot->name = "Copy Modifier";
1116         ot->description = "Duplicate modifier at the same position in the stack";
1117         ot->idname = "OBJECT_OT_modifier_copy";
1118
1119         ot->invoke = modifier_copy_invoke;
1120         ot->exec = modifier_copy_exec;
1121         ot->poll = edit_modifier_poll;
1122
1123         /* flags */
1124         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
1125         edit_modifier_properties(ot);
1126 }
1127
1128 /************* multires delete higher levels operator ****************/
1129
1130 static int multires_poll(bContext *C)
1131 {
1132         return edit_modifier_poll_generic(C, &RNA_MultiresModifier, (1 << OB_MESH));
1133 }
1134
1135 static int multires_higher_levels_delete_exec(bContext *C, wmOperator *op)
1136 {
1137         Object *ob = ED_object_active_context(C);
1138         MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(op, ob, eModifierType_Multires);
1139
1140         if (!mmd)
1141                 return OPERATOR_CANCELLED;
1142
1143         multiresModifier_del_levels(mmd, ob, 1);
1144
1145         ED_object_iter_other(CTX_data_main(C), ob, true,
1146                              ED_object_multires_update_totlevels_cb,
1147                              &mmd->totlvl);
1148
1149         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
1150
1151         return OPERATOR_FINISHED;
1152 }
1153
1154 static int multires_higher_levels_delete_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
1155 {
1156         if (edit_modifier_invoke_properties(C, op))
1157                 return multires_higher_levels_delete_exec(C, op);
1158         else
1159                 return OPERATOR_CANCELLED;
1160 }
1161
1162 void OBJECT_OT_multires_higher_levels_delete(wmOperatorType *ot)
1163 {
1164         ot->name = "Delete Higher Levels";
1165         ot->description = "Deletes the higher resolution mesh, potential loss of detail";
1166         ot->idname = "OBJECT_OT_multires_higher_levels_delete";
1167
1168         ot->poll = multires_poll;
1169         ot->invoke = multires_higher_levels_delete_invoke;
1170         ot->exec = multires_higher_levels_delete_exec;
1171
1172         /* flags */
1173         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
1174         edit_modifier_properties(ot);
1175 }
1176
1177 /****************** multires subdivide operator *********************/
1178
1179 static int multires_subdivide_exec(bContext *C, wmOperator *op)
1180 {
1181         Object *ob = ED_object_active_context(C);
1182         MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(op, ob, eModifierType_Multires);
1183
1184         if (!mmd)
1185                 return OPERATOR_CANCELLED;
1186
1187         multiresModifier_subdivide(mmd, ob, 0, mmd->simple);
1188
1189         ED_object_iter_other(CTX_data_main(C), ob, true,
1190                              ED_object_multires_update_totlevels_cb,
1191                              &mmd->totlvl);
1192
1193         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
1194         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
1195
1196         if (ob->mode & OB_MODE_SCULPT) {
1197                 /* ensure that grid paint mask layer is created */
1198                 BKE_sculpt_mask_layers_ensure(ob, mmd);
1199         }
1200
1201         return OPERATOR_FINISHED;
1202 }
1203
1204 static int multires_subdivide_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
1205 {
1206         if (edit_modifier_invoke_properties(C, op))
1207                 return multires_subdivide_exec(C, op);
1208         else
1209                 return OPERATOR_CANCELLED;
1210 }
1211
1212 void OBJECT_OT_multires_subdivide(wmOperatorType *ot)
1213 {
1214         ot->name = "Multires Subdivide";
1215         ot->description = "Add a new level of subdivision";
1216         ot->idname = "OBJECT_OT_multires_subdivide";
1217
1218         ot->poll = multires_poll;
1219         ot->invoke = multires_subdivide_invoke;
1220         ot->exec = multires_subdivide_exec;
1221
1222         /* flags */
1223         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
1224         edit_modifier_properties(ot);
1225 }
1226
1227 /****************** multires reshape operator *********************/
1228
1229 static int multires_reshape_exec(bContext *C, wmOperator *op)
1230 {
1231         Object *ob = ED_object_active_context(C), *secondob = NULL;
1232         Scene *scene = CTX_data_scene(C);
1233         MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(op, ob, eModifierType_Multires);
1234
1235         if (!mmd)
1236                 return OPERATOR_CANCELLED;
1237
1238         if (mmd->lvl == 0) {
1239                 BKE_report(op->reports, RPT_ERROR, "Reshape can work only with higher levels of subdivisions");
1240                 return OPERATOR_CANCELLED;
1241         }
1242
1243         CTX_DATA_BEGIN(C, Object *, selob, selected_editable_objects)
1244         {
1245                 if (selob->type == OB_MESH && selob != ob) {
1246                         secondob = selob;
1247                         break;
1248                 }
1249         }
1250         CTX_DATA_END;
1251
1252         if (!secondob) {
1253                 BKE_report(op->reports, RPT_ERROR, "Second selected mesh object required to copy shape from");
1254                 return OPERATOR_CANCELLED;
1255         }
1256
1257         if (!multiresModifier_reshape(scene, mmd, ob, secondob)) {
1258                 BKE_report(op->reports, RPT_ERROR, "Objects do not have the same number of vertices");
1259                 return OPERATOR_CANCELLED;
1260         }
1261
1262         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
1263         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
1264
1265         return OPERATOR_FINISHED;
1266 }
1267
1268 static int multires_reshape_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
1269 {
1270         if (edit_modifier_invoke_properties(C, op))
1271                 return multires_reshape_exec(C, op);
1272         else
1273                 return OPERATOR_CANCELLED;
1274 }
1275
1276 void OBJECT_OT_multires_reshape(wmOperatorType *ot)
1277 {
1278         ot->name = "Multires Reshape";
1279         ot->description = "Copy vertex coordinates from other object";
1280         ot->idname = "OBJECT_OT_multires_reshape";
1281
1282         ot->poll = multires_poll;
1283         ot->invoke = multires_reshape_invoke;
1284         ot->exec = multires_reshape_exec;
1285
1286         /* flags */
1287         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
1288         edit_modifier_properties(ot);
1289 }
1290
1291
1292
1293 /****************** multires save external operator *********************/
1294
1295 static int multires_external_save_exec(bContext *C, wmOperator *op)
1296 {
1297         Main *bmain = CTX_data_main(C);
1298         Object *ob = ED_object_active_context(C);
1299         Mesh *me = (ob) ? ob->data : op->customdata;
1300         char path[FILE_MAX];
1301         const bool relative = RNA_boolean_get(op->ptr, "relative_path");
1302
1303         if (!me)
1304                 return OPERATOR_CANCELLED;
1305
1306         if (CustomData_external_test(&me->ldata, CD_MDISPS))
1307                 return OPERATOR_CANCELLED;
1308
1309         RNA_string_get(op->ptr, "filepath", path);
1310
1311         if (relative)
1312                 BLI_path_rel(path, BKE_main_blendfile_path(bmain));
1313
1314         CustomData_external_add(&me->ldata, &me->id, CD_MDISPS, me->totloop, path);
1315         CustomData_external_write(&me->ldata, &me->id, CD_MASK_MESH, me->totloop, 0);
1316
1317         return OPERATOR_FINISHED;
1318 }
1319
1320 static int multires_external_save_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
1321 {
1322         Object *ob = ED_object_active_context(C);
1323         MultiresModifierData *mmd;
1324         Mesh *me = ob->data;
1325         char path[FILE_MAX];
1326
1327         if (!edit_modifier_invoke_properties(C, op))
1328                 return OPERATOR_CANCELLED;
1329
1330         mmd = (MultiresModifierData *)edit_modifier_property_get(op, ob, eModifierType_Multires);
1331
1332         if (!mmd)
1333                 return OPERATOR_CANCELLED;
1334
1335         if (CustomData_external_test(&me->ldata, CD_MDISPS))
1336                 return OPERATOR_CANCELLED;
1337
1338         if (RNA_struct_property_is_set(op->ptr, "filepath"))
1339                 return multires_external_save_exec(C, op);
1340
1341         op->customdata = me;
1342
1343         BLI_snprintf(path, sizeof(path), "//%s.btx", me->id.name + 2);
1344         RNA_string_set(op->ptr, "filepath", path);
1345
1346         WM_event_add_fileselect(C, op);
1347
1348         return OPERATOR_RUNNING_MODAL;
1349 }
1350
1351 void OBJECT_OT_multires_external_save(wmOperatorType *ot)
1352 {
1353         ot->name = "Multires Save External";
1354         ot->description = "Save displacements to an external file";
1355         ot->idname = "OBJECT_OT_multires_external_save";
1356
1357         /* XXX modifier no longer in context after file browser .. ot->poll = multires_poll; */
1358         ot->exec = multires_external_save_exec;
1359         ot->invoke = multires_external_save_invoke;
1360         ot->poll = multires_poll;
1361
1362         /* flags */
1363         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
1364
1365         WM_operator_properties_filesel(
1366                 ot, FILE_TYPE_FOLDER | FILE_TYPE_BTX, FILE_SPECIAL, FILE_SAVE,
1367                 WM_FILESEL_FILEPATH | WM_FILESEL_RELPATH, FILE_DEFAULTDISPLAY, FILE_SORT_ALPHA);
1368         edit_modifier_properties(ot);
1369 }
1370
1371 /****************** multires pack operator *********************/
1372
1373 static int multires_external_pack_exec(bContext *C, wmOperator *UNUSED(op))
1374 {
1375         Object *ob = ED_object_active_context(C);
1376         Mesh *me = ob->data;
1377
1378         if (!CustomData_external_test(&me->ldata, CD_MDISPS))
1379                 return OPERATOR_CANCELLED;
1380
1381         /* XXX don't remove.. */
1382         CustomData_external_remove(&me->ldata, &me->id, CD_MDISPS, me->totloop);
1383
1384         return OPERATOR_FINISHED;
1385 }
1386
1387 void OBJECT_OT_multires_external_pack(wmOperatorType *ot)
1388 {
1389         ot->name = "Multires Pack External";
1390         ot->description = "Pack displacements from an external file";
1391         ot->idname = "OBJECT_OT_multires_external_pack";
1392
1393         ot->poll = multires_poll;
1394         ot->exec = multires_external_pack_exec;
1395
1396         /* flags */
1397         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1398 }
1399
1400 /********************* multires apply base ***********************/
1401 static int multires_base_apply_exec(bContext *C, wmOperator *op)
1402 {
1403         Object *ob = ED_object_active_context(C);
1404         MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(op, ob, eModifierType_Multires);
1405
1406         if (!mmd)
1407                 return OPERATOR_CANCELLED;
1408
1409         multiresModifier_base_apply(mmd, ob);
1410
1411         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
1412         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
1413
1414         return OPERATOR_FINISHED;
1415 }
1416
1417 static int multires_base_apply_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
1418 {
1419         if (edit_modifier_invoke_properties(C, op))
1420                 return multires_base_apply_exec(C, op);
1421         else
1422                 return OPERATOR_CANCELLED;
1423 }
1424
1425
1426 void OBJECT_OT_multires_base_apply(wmOperatorType *ot)
1427 {
1428         ot->name = "Multires Apply Base";
1429         ot->description = "Modify the base mesh to conform to the displaced mesh";
1430         ot->idname = "OBJECT_OT_multires_base_apply";
1431
1432         ot->poll = multires_poll;
1433         ot->invoke = multires_base_apply_invoke;
1434         ot->exec = multires_base_apply_exec;
1435
1436         /* flags */
1437         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
1438         edit_modifier_properties(ot);
1439 }
1440
1441
1442 /************************** skin modifier ***********************/
1443
1444 static void modifier_skin_customdata_delete(Object *ob)
1445 {
1446         Mesh *me = ob->data;
1447         BMEditMesh *em = me->edit_btmesh;
1448
1449         if (em)
1450                 BM_data_layer_free(em->bm, &em->bm->vdata, CD_MVERT_SKIN);
1451         else
1452                 CustomData_free_layer_active(&me->vdata, CD_MVERT_SKIN, me->totvert);
1453 }
1454
1455 static int skin_poll(bContext *C)
1456 {
1457         return (!CTX_data_edit_object(C) &&
1458                 edit_modifier_poll_generic(C, &RNA_SkinModifier, (1 << OB_MESH)));
1459 }
1460
1461 static int skin_edit_poll(bContext *C)
1462 {
1463         return (CTX_data_edit_object(C) &&
1464                 edit_modifier_poll_generic(C, &RNA_SkinModifier, (1 << OB_MESH)));
1465 }
1466
1467 static void skin_root_clear(BMVert *bm_vert, GSet *visited, const int cd_vert_skin_offset)
1468 {
1469         BMEdge *bm_edge;
1470         BMIter bm_iter;
1471
1472         BM_ITER_ELEM (bm_edge, &bm_iter, bm_vert, BM_EDGES_OF_VERT) {
1473                 BMVert *v2 = BM_edge_other_vert(bm_edge, bm_vert);
1474
1475                 if (BLI_gset_add(visited, v2)) {
1476                         MVertSkin *vs = BM_ELEM_CD_GET_VOID_P(v2, cd_vert_skin_offset);
1477
1478                         /* clear vertex root flag and add to visited set */
1479                         vs->flag &= ~MVERT_SKIN_ROOT;
1480
1481                         skin_root_clear(v2, visited, cd_vert_skin_offset);
1482                 }
1483         }
1484 }
1485
1486 static int skin_root_mark_exec(bContext *C, wmOperator *UNUSED(op))
1487 {
1488         Object *ob = CTX_data_edit_object(C);
1489         BMEditMesh *em = BKE_editmesh_from_object(ob);
1490         BMesh *bm = em->bm;
1491         BMVert *bm_vert;
1492         BMIter bm_iter;
1493         GSet *visited;
1494
1495         visited = BLI_gset_ptr_new(__func__);
1496
1497         BKE_mesh_ensure_skin_customdata(ob->data);
1498
1499         const int cd_vert_skin_offset = CustomData_get_offset(&bm->vdata, CD_MVERT_SKIN);
1500
1501         BM_ITER_MESH (bm_vert, &bm_iter, bm, BM_VERTS_OF_MESH) {
1502                 if (BM_elem_flag_test(bm_vert, BM_ELEM_SELECT) &&
1503                     BLI_gset_add(visited, bm_vert))
1504                 {
1505                         MVertSkin *vs = BM_ELEM_CD_GET_VOID_P(bm_vert, cd_vert_skin_offset);
1506
1507                         /* mark vertex as root and add to visited set */
1508                         vs->flag |= MVERT_SKIN_ROOT;
1509
1510                         /* clear root flag from all connected vertices (recursively) */
1511                         skin_root_clear(bm_vert, visited, cd_vert_skin_offset);
1512                 }
1513         }
1514
1515         BLI_gset_free(visited, NULL);
1516
1517         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
1518         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
1519
1520         return OPERATOR_FINISHED;
1521 }
1522
1523 void OBJECT_OT_skin_root_mark(wmOperatorType *ot)
1524 {
1525         ot->name = "Skin Root Mark";
1526         ot->description = "Mark selected vertices as roots";
1527         ot->idname = "OBJECT_OT_skin_root_mark";
1528
1529         ot->poll = skin_edit_poll;
1530         ot->exec = skin_root_mark_exec;
1531
1532         /* flags */
1533         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1534 }
1535
1536 typedef enum {
1537         SKIN_LOOSE_MARK,
1538         SKIN_LOOSE_CLEAR
1539 } SkinLooseAction;
1540
1541 static int skin_loose_mark_clear_exec(bContext *C, wmOperator *op)
1542 {
1543         Object *ob = CTX_data_edit_object(C);
1544         BMEditMesh *em = BKE_editmesh_from_object(ob);
1545         BMesh *bm = em->bm;
1546         BMVert *bm_vert;
1547         BMIter bm_iter;
1548         SkinLooseAction action = RNA_enum_get(op->ptr, "action");
1549
1550         if (!CustomData_has_layer(&bm->vdata, CD_MVERT_SKIN)) {
1551                 return OPERATOR_CANCELLED;
1552         }
1553
1554         BM_ITER_MESH (bm_vert, &bm_iter, bm, BM_VERTS_OF_MESH) {
1555                 if (BM_elem_flag_test(bm_vert, BM_ELEM_SELECT)) {
1556                         MVertSkin *vs = CustomData_bmesh_get(&bm->vdata,
1557                                                              bm_vert->head.data,
1558                                                              CD_MVERT_SKIN);
1559
1560
1561                         switch (action) {
1562                                 case SKIN_LOOSE_MARK:
1563                                         vs->flag |= MVERT_SKIN_LOOSE;
1564                                         break;
1565                                 case SKIN_LOOSE_CLEAR:
1566                                         vs->flag &= ~MVERT_SKIN_LOOSE;
1567                                         break;
1568                         }
1569                 }
1570         }
1571
1572         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
1573         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
1574
1575         return OPERATOR_FINISHED;
1576 }
1577
1578 void OBJECT_OT_skin_loose_mark_clear(wmOperatorType *ot)
1579 {
1580         static const EnumPropertyItem action_items[] = {
1581                 {SKIN_LOOSE_MARK, "MARK", 0, "Mark", "Mark selected vertices as loose"},
1582                 {SKIN_LOOSE_CLEAR, "CLEAR", 0, "Clear", "Set selected vertices as not loose"},
1583                 {0, NULL, 0, NULL, NULL}
1584         };
1585
1586         ot->name = "Skin Mark/Clear Loose";
1587         ot->description = "Mark/clear selected vertices as loose";
1588         ot->idname = "OBJECT_OT_skin_loose_mark_clear";
1589
1590         ot->poll = skin_edit_poll;
1591         ot->exec = skin_loose_mark_clear_exec;
1592
1593         /* flags */
1594         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1595
1596         RNA_def_enum(ot->srna, "action", action_items, SKIN_LOOSE_MARK, "Action", NULL);
1597 }
1598
1599 static int skin_radii_equalize_exec(bContext *C, wmOperator *UNUSED(op))
1600 {
1601         Object *ob = CTX_data_edit_object(C);
1602         BMEditMesh *em = BKE_editmesh_from_object(ob);
1603         BMesh *bm = em->bm;
1604         BMVert *bm_vert;
1605         BMIter bm_iter;
1606
1607         if (!CustomData_has_layer(&bm->vdata, CD_MVERT_SKIN)) {
1608                 return OPERATOR_CANCELLED;
1609         }
1610
1611         BM_ITER_MESH (bm_vert, &bm_iter, bm, BM_VERTS_OF_MESH) {
1612                 if (BM_elem_flag_test(bm_vert, BM_ELEM_SELECT)) {
1613                         MVertSkin *vs = CustomData_bmesh_get(&bm->vdata,
1614                                                              bm_vert->head.data,
1615                                                              CD_MVERT_SKIN);
1616                         float avg = (vs->radius[0] + vs->radius[1]) * 0.5f;
1617
1618                         vs->radius[0] = vs->radius[1] = avg;
1619                 }
1620         }
1621
1622         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
1623         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
1624
1625         return OPERATOR_FINISHED;
1626 }
1627
1628 void OBJECT_OT_skin_radii_equalize(wmOperatorType *ot)
1629 {
1630         ot->name = "Skin Radii Equalize";
1631         ot->description = "Make skin radii of selected vertices equal on each axis";
1632         ot->idname = "OBJECT_OT_skin_radii_equalize";
1633
1634         ot->poll = skin_edit_poll;
1635         ot->exec = skin_radii_equalize_exec;
1636
1637         /* flags */
1638         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1639 }
1640
1641 static void skin_armature_bone_create(Object *skin_ob,
1642                                       MVert *mvert, MEdge *medge,
1643                                       bArmature *arm,
1644                                       BLI_bitmap *edges_visited,
1645                                       const MeshElemMap *emap,
1646                                       EditBone *parent_bone,
1647                                       int parent_v)
1648 {
1649         int i;
1650
1651         for (i = 0; i < emap[parent_v].count; i++) {
1652                 int endx = emap[parent_v].indices[i];
1653                 const MEdge *e = &medge[endx];
1654                 EditBone *bone;
1655                 bDeformGroup *dg;
1656                 int v;
1657
1658                 /* ignore edge if already visited */
1659                 if (BLI_BITMAP_TEST(edges_visited, endx))
1660                         continue;
1661                 BLI_BITMAP_ENABLE(edges_visited, endx);
1662
1663                 v = (e->v1 == parent_v ? e->v2 : e->v1);
1664
1665                 bone = ED_armature_ebone_add(arm, "Bone");
1666
1667                 bone->parent = parent_bone;
1668                 bone->flag |= BONE_CONNECTED;
1669
1670                 copy_v3_v3(bone->head, mvert[parent_v].co);
1671                 copy_v3_v3(bone->tail, mvert[v].co);
1672                 bone->rad_head = bone->rad_tail = 0.25;
1673                 BLI_snprintf(bone->name, sizeof(bone->name), "Bone.%.2d", endx);
1674
1675                 /* add bDeformGroup */
1676                 if ((dg = BKE_object_defgroup_add_name(skin_ob, bone->name))) {
1677                         ED_vgroup_vert_add(skin_ob, dg, parent_v, 1, WEIGHT_REPLACE);
1678                         ED_vgroup_vert_add(skin_ob, dg, v, 1, WEIGHT_REPLACE);
1679                 }
1680
1681                 skin_armature_bone_create(skin_ob,
1682                                           mvert, medge,
1683                                           arm,
1684                                           edges_visited,
1685                                           emap,
1686                                           bone,
1687                                           v);
1688         }
1689 }
1690
1691 static Object *modifier_skin_armature_create(Main *bmain, Scene *scene, Object *skin_ob)
1692 {
1693         BLI_bitmap *edges_visited;
1694         DerivedMesh *deform_dm;
1695         MVert *mvert;
1696         Mesh *me = skin_ob->data;
1697         Object *arm_ob;
1698         bArmature *arm;
1699         MVertSkin *mvert_skin;
1700         MeshElemMap *emap;
1701         int *emap_mem;
1702         int v;
1703
1704         deform_dm = mesh_get_derived_deform(scene, skin_ob, CD_MASK_BAREMESH);
1705         mvert = deform_dm->getVertArray(deform_dm);
1706
1707         /* add vertex weights to original mesh */
1708         CustomData_add_layer(&me->vdata,
1709                              CD_MDEFORMVERT,
1710                              CD_CALLOC,
1711                              NULL,
1712                              me->totvert);
1713
1714         arm_ob = BKE_object_add(bmain, scene, OB_ARMATURE, NULL);
1715         BKE_object_transform_copy(arm_ob, skin_ob);
1716         arm = arm_ob->data;
1717         arm->layer = 1;
1718         arm_ob->dtx |= OB_DRAWXRAY;
1719         arm->drawtype = ARM_LINE;
1720         arm->edbo = MEM_callocN(sizeof(ListBase), "edbo armature");
1721
1722         mvert_skin = CustomData_get_layer(&me->vdata, CD_MVERT_SKIN);
1723         BKE_mesh_vert_edge_map_create(&emap, &emap_mem,
1724                              me->medge, me->totvert, me->totedge);
1725
1726         edges_visited = BLI_BITMAP_NEW(me->totedge, "edge_visited");
1727
1728         /* note: we use EditBones here, easier to set them up and use
1729          * edit-armature functions to convert back to regular bones */
1730         for (v = 0; v < me->totvert; v++) {
1731                 if (mvert_skin[v].flag & MVERT_SKIN_ROOT) {
1732                         EditBone *bone = NULL;
1733
1734                         /* Unless the skin root has just one adjacent edge, create
1735                          * a fake root bone (have it going off in the Y direction
1736                          * (arbitrary) */
1737                         if (emap[v].count > 1) {
1738                                 bone = ED_armature_ebone_add(arm, "Bone");
1739
1740                                 copy_v3_v3(bone->head, me->mvert[v].co);
1741                                 copy_v3_v3(bone->tail, me->mvert[v].co);
1742
1743                                 bone->head[1] = 1.0f;
1744                                 bone->rad_head = bone->rad_tail = 0.25;
1745                         }
1746
1747                         if (emap[v].count >= 1) {
1748                                 skin_armature_bone_create(skin_ob,
1749                                                           mvert, me->medge,
1750                                                           arm,
1751                                                           edges_visited,
1752                                                           emap,
1753                                                           bone,
1754                                                           v);
1755                         }
1756                 }
1757         }
1758
1759         MEM_freeN(edges_visited);
1760         MEM_freeN(emap);
1761         MEM_freeN(emap_mem);
1762
1763         ED_armature_from_edit(bmain, arm);
1764         ED_armature_edit_free(arm);
1765
1766         return arm_ob;
1767 }
1768
1769 static int skin_armature_create_exec(bContext *C, wmOperator *op)
1770 {
1771         Main *bmain = CTX_data_main(C);
1772         Scene *scene = CTX_data_scene(C);
1773         Object *ob = CTX_data_active_object(C), *arm_ob;
1774         Mesh *me = ob->data;
1775         ModifierData *skin_md;
1776         ArmatureModifierData *arm_md;
1777
1778         if (!CustomData_has_layer(&me->vdata, CD_MVERT_SKIN)) {
1779                 BKE_reportf(op->reports, RPT_WARNING, "Mesh '%s' has no skin vertex data", me->id.name + 2);
1780                 return OPERATOR_CANCELLED;
1781         }
1782
1783         /* create new armature */
1784         arm_ob = modifier_skin_armature_create(bmain, scene, ob);
1785
1786         /* add a modifier to connect the new armature to the mesh */
1787         arm_md = (ArmatureModifierData *)modifier_new(eModifierType_Armature);
1788         if (arm_md) {
1789                 skin_md = edit_modifier_property_get(op, ob, eModifierType_Skin);
1790                 BLI_insertlinkafter(&ob->modifiers, skin_md, arm_md);
1791
1792                 arm_md->object = arm_ob;
1793                 arm_md->deformflag = ARM_DEF_VGROUP | ARM_DEF_QUATERNION;
1794                 DAG_relations_tag_update(bmain);
1795                 DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
1796         }
1797
1798         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
1799
1800         return OPERATOR_FINISHED;
1801 }
1802
1803 static int skin_armature_create_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
1804 {
1805         if (edit_modifier_invoke_properties(C, op))
1806                 return skin_armature_create_exec(C, op);
1807         else
1808                 return OPERATOR_CANCELLED;
1809 }
1810
1811 void OBJECT_OT_skin_armature_create(wmOperatorType *ot)
1812 {
1813         ot->name = "Skin Armature Create";
1814         ot->description = "Create an armature that parallels the skin layout";
1815         ot->idname = "OBJECT_OT_skin_armature_create";
1816
1817         ot->poll = skin_poll;
1818         ot->invoke = skin_armature_create_invoke;
1819         ot->exec = skin_armature_create_exec;
1820
1821         /* flags */
1822         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
1823         edit_modifier_properties(ot);
1824 }
1825 /************************ delta mush bind operator *********************/
1826
1827 static int correctivesmooth_poll(bContext *C)
1828 {
1829         return edit_modifier_poll_generic(C, &RNA_CorrectiveSmoothModifier, 0);
1830 }
1831
1832 static int correctivesmooth_bind_exec(bContext *C, wmOperator *op)
1833 {
1834         Scene *scene = CTX_data_scene(C);
1835         Object *ob = ED_object_active_context(C);
1836         CorrectiveSmoothModifierData *csmd = (CorrectiveSmoothModifierData *)edit_modifier_property_get(op, ob, eModifierType_CorrectiveSmooth);
1837         bool is_bind;
1838
1839         if (!csmd) {
1840                 return OPERATOR_CANCELLED;
1841         }
1842
1843         if (!modifier_isEnabled(scene, &csmd->modifier, eModifierMode_Realtime)) {
1844                 BKE_report(op->reports, RPT_ERROR, "Modifier is disabled");
1845                 return OPERATOR_CANCELLED;
1846         }
1847
1848         is_bind = (csmd->bind_coords != NULL);
1849
1850         MEM_SAFE_FREE(csmd->bind_coords);
1851         MEM_SAFE_FREE(csmd->delta_cache);
1852
1853         if (is_bind) {
1854                 /* toggle off */
1855                 csmd->bind_coords_num = 0;
1856         }
1857         else {
1858                 /* signal to modifier to recalculate */
1859                 csmd->bind_coords_num = (unsigned int)-1;
1860         }
1861
1862         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
1863         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
1864
1865         return OPERATOR_FINISHED;
1866 }
1867
1868 static int correctivesmooth_bind_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
1869 {
1870         if (edit_modifier_invoke_properties(C, op))
1871                 return correctivesmooth_bind_exec(C, op);
1872         else
1873                 return OPERATOR_CANCELLED;
1874 }
1875
1876 void OBJECT_OT_correctivesmooth_bind(wmOperatorType *ot)
1877 {
1878         /* identifiers */
1879         ot->name = "Corrective Smooth Bind";
1880         ot->description = "Bind base pose in Corrective Smooth modifier";
1881         ot->idname = "OBJECT_OT_correctivesmooth_bind";
1882
1883         /* api callbacks */
1884         ot->poll = correctivesmooth_poll;
1885         ot->invoke = correctivesmooth_bind_invoke;
1886         ot->exec = correctivesmooth_bind_exec;
1887
1888         /* flags */
1889         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
1890         edit_modifier_properties(ot);
1891 }
1892
1893 /************************ mdef bind operator *********************/
1894
1895 static int meshdeform_poll(bContext *C)
1896 {
1897         return edit_modifier_poll_generic(C, &RNA_MeshDeformModifier, 0);
1898 }
1899
1900 static int meshdeform_bind_exec(bContext *C, wmOperator *op)
1901 {
1902         Main *bmain = CTX_data_main(C);
1903         Scene *scene = CTX_data_scene(C);
1904         Object *ob = ED_object_active_context(C);
1905         MeshDeformModifierData *mmd = (MeshDeformModifierData *)edit_modifier_property_get(op, ob, eModifierType_MeshDeform);
1906
1907         if (!mmd)
1908                 return OPERATOR_CANCELLED;
1909
1910         if (mmd->bindcagecos) {
1911                 MEM_freeN(mmd->bindcagecos);
1912                 if (mmd->dyngrid) MEM_freeN(mmd->dyngrid);
1913                 if (mmd->dyninfluences) MEM_freeN(mmd->dyninfluences);
1914                 if (mmd->bindinfluences) MEM_freeN(mmd->bindinfluences);
1915                 if (mmd->bindoffsets) MEM_freeN(mmd->bindoffsets);
1916                 if (mmd->dynverts) MEM_freeN(mmd->dynverts);
1917                 if (mmd->bindweights) MEM_freeN(mmd->bindweights);  /* deprecated */
1918                 if (mmd->bindcos) MEM_freeN(mmd->bindcos);  /* deprecated */
1919
1920                 mmd->bindcagecos = NULL;
1921                 mmd->dyngrid = NULL;
1922                 mmd->dyninfluences = NULL;
1923                 mmd->bindinfluences = NULL;
1924                 mmd->bindoffsets = NULL;
1925                 mmd->dynverts = NULL;
1926                 mmd->bindweights = NULL; /* deprecated */
1927                 mmd->bindcos = NULL; /* deprecated */
1928                 mmd->totvert = 0;
1929                 mmd->totcagevert = 0;
1930                 mmd->totinfluence = 0;
1931
1932                 DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
1933                 WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
1934         }
1935         else {
1936                 DerivedMesh *dm;
1937                 int mode = mmd->modifier.mode;
1938
1939                 /* force modifier to run, it will call binding routine */
1940                 mmd->bindfunc = ED_mesh_deform_bind_callback;
1941                 mmd->modifier.mode |= eModifierMode_Realtime;
1942
1943                 if (ob->type == OB_MESH) {
1944                         dm = mesh_create_derived_view(scene, ob, 0);
1945                         dm->release(dm);
1946                 }
1947                 else if (ob->type == OB_LATTICE) {
1948                         BKE_lattice_modifiers_calc(scene, ob);
1949                 }
1950                 else if (ob->type == OB_MBALL) {
1951                         BKE_displist_make_mball(bmain, bmain->eval_ctx, scene, ob);
1952                 }
1953                 else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
1954                         BKE_displist_make_curveTypes(scene, ob, 0);
1955                 }
1956
1957                 mmd->bindfunc = NULL;
1958                 mmd->modifier.mode = mode;
1959         }
1960
1961         return OPERATOR_FINISHED;
1962 }
1963
1964 static int meshdeform_bind_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
1965 {
1966         if (edit_modifier_invoke_properties(C, op))
1967                 return meshdeform_bind_exec(C, op);
1968         else
1969                 return OPERATOR_CANCELLED;
1970 }
1971
1972 void OBJECT_OT_meshdeform_bind(wmOperatorType *ot)
1973 {
1974         /* identifiers */
1975         ot->name = "Mesh Deform Bind";
1976         ot->description = "Bind mesh to cage in mesh deform modifier";
1977         ot->idname = "OBJECT_OT_meshdeform_bind";
1978
1979         /* api callbacks */
1980         ot->poll = meshdeform_poll;
1981         ot->invoke = meshdeform_bind_invoke;
1982         ot->exec = meshdeform_bind_exec;
1983
1984         /* flags */
1985         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
1986         edit_modifier_properties(ot);
1987 }
1988
1989 /****************** explode refresh operator *********************/
1990
1991 static int explode_poll(bContext *C)
1992 {
1993         return edit_modifier_poll_generic(C, &RNA_ExplodeModifier, 0);
1994 }
1995
1996 static int explode_refresh_exec(bContext *C, wmOperator *op)
1997 {
1998         Object *ob = ED_object_active_context(C);
1999         ExplodeModifierData *emd = (ExplodeModifierData *)edit_modifier_property_get(op, ob, eModifierType_Explode);
2000
2001         if (!emd)
2002                 return OPERATOR_CANCELLED;
2003
2004         emd->flag |= eExplodeFlag_CalcFaces;
2005
2006         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
2007         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
2008
2009         return OPERATOR_FINISHED;
2010 }
2011
2012 static int explode_refresh_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
2013 {
2014         if (edit_modifier_invoke_properties(C, op))
2015                 return explode_refresh_exec(C, op);
2016         else
2017                 return OPERATOR_CANCELLED;
2018 }
2019
2020
2021 void OBJECT_OT_explode_refresh(wmOperatorType *ot)
2022 {
2023         ot->name = "Explode Refresh";
2024         ot->description = "Refresh data in the Explode modifier";
2025         ot->idname = "OBJECT_OT_explode_refresh";
2026
2027         ot->poll = explode_poll;
2028         ot->invoke = explode_refresh_invoke;
2029         ot->exec = explode_refresh_exec;
2030
2031         /* flags */
2032         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
2033         edit_modifier_properties(ot);
2034 }
2035
2036
2037 /****************** ocean bake operator *********************/
2038
2039 static int ocean_bake_poll(bContext *C)
2040 {
2041         return edit_modifier_poll_generic(C, &RNA_OceanModifier, 0);
2042 }
2043
2044 /* copied from init_ocean_modifier, MOD_ocean.c */
2045 static void init_ocean_modifier_bake(struct Ocean *oc, struct OceanModifierData *omd)
2046 {
2047         int do_heightfield, do_chop, do_normals, do_jacobian;
2048
2049         if (!omd || !oc) return;
2050
2051         do_heightfield = true;
2052         do_chop = (omd->chop_amount > 0);
2053         do_normals = (omd->flag & MOD_OCEAN_GENERATE_NORMALS);
2054         do_jacobian = (omd->flag & MOD_OCEAN_GENERATE_FOAM);
2055
2056         BKE_ocean_init(oc, omd->resolution * omd->resolution, omd->resolution * omd->resolution, omd->spatial_size, omd->spatial_size,
2057                        omd->wind_velocity, omd->smallest_wave, 1.0, omd->wave_direction, omd->damp, omd->wave_alignment,
2058                        omd->depth, omd->time,
2059                        do_heightfield, do_chop, do_normals, do_jacobian,
2060                        omd->seed);
2061 }
2062
2063 typedef struct OceanBakeJob {
2064         /* from wmJob */
2065         void *owner;
2066         short *stop, *do_update;
2067         float *progress;
2068         int current_frame;
2069         struct OceanCache *och;
2070         struct Ocean *ocean;
2071         struct OceanModifierData *omd;
2072 } OceanBakeJob;
2073
2074 static void oceanbake_free(void *customdata)
2075 {
2076         OceanBakeJob *oj = customdata;
2077         MEM_freeN(oj);
2078 }
2079
2080 /* called by oceanbake, only to check job 'stop' value */
2081 static int oceanbake_breakjob(void *UNUSED(customdata))
2082 {
2083         //OceanBakeJob *ob = (OceanBakeJob *)customdata;
2084         //return *(ob->stop);
2085
2086         /* this is not nice yet, need to make the jobs list template better
2087          * for identifying/acting upon various different jobs */
2088         /* but for now we'll reuse the render break... */
2089         return (G.is_break);
2090 }
2091
2092 /* called by oceanbake, wmJob sends notifier */
2093 static void oceanbake_update(void *customdata, float progress, int *cancel)
2094 {
2095         OceanBakeJob *oj = customdata;
2096
2097         if (oceanbake_breakjob(oj))
2098                 *cancel = 1;
2099
2100         *(oj->do_update) = true;
2101         *(oj->progress) = progress;
2102 }
2103
2104 static void oceanbake_startjob(void *customdata, short *stop, short *do_update, float *progress)
2105 {
2106         OceanBakeJob *oj = customdata;
2107
2108         oj->stop = stop;
2109         oj->do_update = do_update;
2110         oj->progress = progress;
2111
2112         G.is_break = false;   /* XXX shared with render - replace with job 'stop' switch */
2113
2114         BKE_ocean_bake(oj->ocean, oj->och, oceanbake_update, (void *)oj);
2115
2116         *do_update = true;
2117         *stop = 0;
2118 }
2119
2120 static void oceanbake_endjob(void *customdata)
2121 {
2122         OceanBakeJob *oj = customdata;
2123
2124         if (oj->ocean) {
2125                 BKE_ocean_free(oj->ocean);
2126                 oj->ocean = NULL;
2127         }
2128
2129         oj->omd->oceancache = oj->och;
2130         oj->omd->cached = true;
2131 }
2132
2133 static int ocean_bake_exec(bContext *C, wmOperator *op)
2134 {
2135         Main *bmain = CTX_data_main(C);
2136         Object *ob = ED_object_active_context(C);
2137         OceanModifierData *omd = (OceanModifierData *)edit_modifier_property_get(op, ob, eModifierType_Ocean);
2138         Scene *scene = CTX_data_scene(C);
2139         OceanCache *och;
2140         struct Ocean *ocean;
2141         int f, cfra, i = 0;
2142         const bool free = RNA_boolean_get(op->ptr, "free");
2143
2144         wmJob *wm_job;
2145         OceanBakeJob *oj;
2146
2147         if (!omd)
2148                 return OPERATOR_CANCELLED;
2149
2150         if (free) {
2151                 omd->refresh |= MOD_OCEAN_REFRESH_CLEAR_CACHE;
2152                 DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
2153                 WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
2154                 return OPERATOR_FINISHED;
2155         }
2156
2157         och = BKE_ocean_init_cache(omd->cachepath, modifier_path_relbase(bmain, ob),
2158                                    omd->bakestart, omd->bakeend, omd->wave_scale,
2159                                    omd->chop_amount, omd->foam_coverage, omd->foam_fade, omd->resolution);
2160
2161         och->time = MEM_mallocN(och->duration * sizeof(float), "foam bake time");
2162
2163         cfra = scene->r.cfra;
2164
2165         /* precalculate time variable before baking */
2166         for (f = omd->bakestart; f <= omd->bakeend; f++) {
2167                 /* from physics_fluid.c:
2168                  *
2169                  * XXX: This can't be used due to an anim sys optimization that ignores recalc object animation,
2170                  * leaving it for the depgraph (this ignores object animation such as modifier properties though... :/ )
2171                  * --> BKE_animsys_evaluate_all_animation(bmain, eval_time);
2172                  * This doesn't work with drivers:
2173                  * --> BKE_animsys_evaluate_animdata(&fsDomain->id, fsDomain->adt, eval_time, ADT_RECALC_ALL);
2174                  */
2175
2176                 /* Modifying the global scene isn't nice, but we can do it in
2177                  * this part of the process before a threaded job is created */
2178
2179                 //scene->r.cfra = f;
2180                 //ED_update_for_newframe(bmain, scene, 1);
2181
2182                 /* ok, this doesn't work with drivers, but is way faster.
2183                  * let's use this for now and hope nobody wants to drive the time value... */
2184                 BKE_animsys_evaluate_animdata(scene, (ID *)ob, ob->adt, f, ADT_RECALC_ANIM);
2185
2186                 och->time[i] = omd->time;
2187                 i++;
2188         }
2189
2190         /* make a copy of ocean to use for baking - threadsafety */
2191         ocean = BKE_ocean_add();
2192         init_ocean_modifier_bake(ocean, omd);
2193
2194 #if 0
2195         BKE_ocean_bake(ocean, och);
2196
2197         omd->oceancache = och;
2198         omd->cached = true;
2199
2200         scene->r.cfra = cfra;
2201
2202         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
2203         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
2204 #endif
2205
2206         /* job stuff */
2207
2208         scene->r.cfra = cfra;
2209
2210         /* setup job */
2211         wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Ocean Simulation",
2212                              WM_JOB_PROGRESS, WM_JOB_TYPE_OBJECT_SIM_OCEAN);
2213         oj = MEM_callocN(sizeof(OceanBakeJob), "ocean bake job");
2214         oj->ocean = ocean;
2215         oj->och = och;
2216         oj->omd = omd;
2217
2218         WM_jobs_customdata_set(wm_job, oj, oceanbake_free);
2219         WM_jobs_timer(wm_job, 0.1, NC_OBJECT | ND_MODIFIER, NC_OBJECT | ND_MODIFIER);
2220         WM_jobs_callbacks(wm_job, oceanbake_startjob, NULL, NULL, oceanbake_endjob);
2221
2222         WM_jobs_start(CTX_wm_manager(C), wm_job);
2223
2224
2225
2226         return OPERATOR_FINISHED;
2227 }
2228
2229 static int ocean_bake_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
2230 {
2231         if (edit_modifier_invoke_properties(C, op))
2232                 return ocean_bake_exec(C, op);
2233         else
2234                 return OPERATOR_CANCELLED;
2235 }
2236
2237
2238 void OBJECT_OT_ocean_bake(wmOperatorType *ot)
2239 {
2240         ot->name = "Bake Ocean";
2241         ot->description = "Bake an image sequence of ocean data";
2242         ot->idname = "OBJECT_OT_ocean_bake";
2243
2244         ot->poll = ocean_bake_poll;
2245         ot->invoke = ocean_bake_invoke;
2246         ot->exec = ocean_bake_exec;
2247
2248         /* flags */
2249         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
2250         edit_modifier_properties(ot);
2251
2252         RNA_def_boolean(ot->srna, "free", false, "Free", "Free the bake, rather than generating it");
2253 }
2254
2255 /************************ LaplacianDeform bind operator *********************/
2256
2257 static int laplaciandeform_poll(bContext *C)
2258 {
2259         return edit_modifier_poll_generic(C, &RNA_LaplacianDeformModifier, 0);
2260 }
2261
2262 static int laplaciandeform_bind_exec(bContext *C, wmOperator *op)
2263 {
2264         Object *ob = ED_object_active_context(C);
2265         LaplacianDeformModifierData *lmd = (LaplacianDeformModifierData *)edit_modifier_property_get(op, ob, eModifierType_LaplacianDeform);
2266
2267         if (!lmd)
2268                 return OPERATOR_CANCELLED;
2269         if (lmd->flag & MOD_LAPLACIANDEFORM_BIND) {
2270                 lmd->flag &= ~MOD_LAPLACIANDEFORM_BIND;
2271         }
2272         else {
2273                 lmd->flag |= MOD_LAPLACIANDEFORM_BIND;
2274         }
2275         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
2276         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
2277         return OPERATOR_FINISHED;
2278 }
2279
2280 static int laplaciandeform_bind_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
2281 {
2282         if (edit_modifier_invoke_properties(C, op))
2283                 return laplaciandeform_bind_exec(C, op);
2284         else
2285                 return OPERATOR_CANCELLED;
2286 }
2287
2288 void OBJECT_OT_laplaciandeform_bind(wmOperatorType *ot)
2289 {
2290         /* identifiers */
2291         ot->name = "Laplacian Deform Bind";
2292         ot->description = "Bind mesh to system in laplacian deform modifier";
2293         ot->idname = "OBJECT_OT_laplaciandeform_bind";
2294
2295         /* api callbacks */
2296         ot->poll = laplaciandeform_poll;
2297         ot->invoke = laplaciandeform_bind_invoke;
2298         ot->exec = laplaciandeform_bind_exec;
2299
2300         /* flags */
2301         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
2302         edit_modifier_properties(ot);
2303 }
2304
2305 /************************ sdef bind operator *********************/
2306
2307 static int surfacedeform_bind_poll(bContext *C)
2308 {
2309         return edit_modifier_poll_generic(C, &RNA_SurfaceDeformModifier, 0);
2310 }
2311
2312 static int surfacedeform_bind_exec(bContext *C, wmOperator *op)
2313 {
2314         Object *ob = ED_object_active_context(C);
2315         SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)edit_modifier_property_get(op, ob, eModifierType_SurfaceDeform);
2316
2317         if (!smd)
2318                 return OPERATOR_CANCELLED;
2319
2320         if (smd->flags & MOD_SDEF_BIND) {
2321                 smd->flags &= ~MOD_SDEF_BIND;
2322         }
2323         else if (smd->target) {
2324                 smd->flags |= MOD_SDEF_BIND;
2325         }
2326
2327         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
2328         WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
2329
2330         return OPERATOR_FINISHED;
2331 }
2332
2333 static int surfacedeform_bind_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
2334 {
2335         if (edit_modifier_invoke_properties(C, op))
2336                 return surfacedeform_bind_exec(C, op);
2337         else
2338                 return OPERATOR_CANCELLED;
2339 }
2340
2341 void OBJECT_OT_surfacedeform_bind(wmOperatorType *ot)
2342 {
2343         /* identifiers */
2344         ot->name = "Surface Deform Bind";
2345         ot->description = "Bind mesh to target in surface deform modifier";
2346         ot->idname = "OBJECT_OT_surfacedeform_bind";
2347
2348         /* api callbacks */
2349         ot->poll = surfacedeform_bind_poll;
2350         ot->invoke = surfacedeform_bind_invoke;
2351         ot->exec = surfacedeform_bind_exec;
2352
2353         /* flags */
2354         ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
2355         edit_modifier_properties(ot);
2356 }