Blender  V2.93
blenkernel/intern/modifier.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2005 by the Blender Foundation.
17  * All rights reserved.
18  * Modifier stack implementation.
19  *
20  * BKE_modifier.h contains the function prototypes for this file.
21  */
22 
27 /* Allow using deprecated functionality for .blend file I/O. */
28 #define DNA_DEPRECATED_ALLOW
29 
30 #include <float.h>
31 #include <math.h>
32 #include <stdarg.h>
33 #include <stddef.h>
34 #include <stdlib.h>
35 #include <string.h>
36 
37 #include "MEM_guardedalloc.h"
38 
39 #include "DNA_armature_types.h"
40 #include "DNA_cloth_types.h"
41 #include "DNA_dynamicpaint_types.h"
42 #include "DNA_fluid_types.h"
44 #include "DNA_mesh_types.h"
46 #include "DNA_object_force_types.h"
47 #include "DNA_object_types.h"
48 #include "DNA_scene_types.h"
49 #include "DNA_screen_types.h"
50 
51 #include "BLI_linklist.h"
52 #include "BLI_listbase.h"
53 #include "BLI_path_util.h"
54 #include "BLI_session_uuid.h"
55 #include "BLI_string.h"
56 #include "BLI_string_utils.h"
57 #include "BLI_utildefines.h"
58 
59 #include "BLT_translation.h"
60 
61 #include "BKE_DerivedMesh.h"
62 #include "BKE_appdir.h"
63 #include "BKE_editmesh.h"
64 #include "BKE_editmesh_cache.h"
65 #include "BKE_effect.h"
66 #include "BKE_fluid.h"
67 #include "BKE_global.h"
68 #include "BKE_gpencil_modifier.h"
69 #include "BKE_idtype.h"
70 #include "BKE_key.h"
71 #include "BKE_lib_id.h"
72 #include "BKE_lib_query.h"
73 #include "BKE_mesh.h"
74 #include "BKE_mesh_wrapper.h"
75 #include "BKE_multires.h"
76 #include "BKE_object.h"
77 #include "BKE_pointcache.h"
78 
79 /* may move these, only for BKE_modifier_path_relbase */
80 #include "BKE_main.h"
81 /* end */
82 
83 #include "DEG_depsgraph.h"
84 #include "DEG_depsgraph_query.h"
85 
86 #include "MOD_modifiertypes.h"
87 
88 #include "BLO_read_write.h"
89 
90 #include "CLG_log.h"
91 
92 static CLG_LogRef LOG = {"bke.modifier"};
95 
97 {
98  ModifierData *md;
99 
100  /* Initialize modifier types */
101  modifier_type_init(modifier_types); /* MOD_utils.c */
102 
103  /* Initialize global cmmon storage used for virtual modifier list */
106  BKE_modifier_free(md);
107 
110  BKE_modifier_free(md);
111 
114  BKE_modifier_free(md);
115 
118  BKE_modifier_free(md);
119 
124 }
125 
127 {
128  /* type unsigned, no need to check < 0 */
129  if (type < NUM_MODIFIER_TYPES && modifier_types[type] && modifier_types[type]->name[0] != '\0') {
130  return modifier_types[type];
131  }
132 
133  return NULL;
134 }
135 
140 {
142 
143  strcpy(r_idname, MODIFIER_TYPE_PANEL_PREFIX);
144  strcat(r_idname, mti->name);
145 }
146 
148 {
150 }
151 
152 /***/
153 
155 {
157  ModifierData *md = MEM_callocN(mti->structSize, mti->structName);
158 
159  /* note, this name must be made unique later */
160  BLI_strncpy(md->name, DATA_(mti->name), sizeof(md->name));
161 
162  md->type = type;
165  md->ui_expand_flag = 1; /* Only open the main panel at the beginning, not the sub-panels. */
166 
169  }
170 
171  if (mti->initData) {
172  mti->initData(md);
173  }
174 
176 
177  return md;
178 }
179 
180 static void modifier_free_data_id_us_cb(void *UNUSED(userData),
181  Object *UNUSED(ob),
182  ID **idpoin,
183  int cb_flag)
184 {
185  ID *id = *idpoin;
186  if (id != NULL && (cb_flag & IDWALK_CB_USER) != 0) {
187  id_us_min(id);
188  }
189 }
190 
191 void BKE_modifier_free_ex(ModifierData *md, const int flag)
192 {
193  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
194 
195  if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
196  if (mti->foreachIDLink) {
198  }
199  }
200 
201  if (mti->freeData) {
202  mti->freeData(md);
203  }
204  if (md->error) {
205  MEM_freeN(md->error);
206  }
207 
208  MEM_freeN(md);
209 }
210 
212 {
213  BKE_modifier_free_ex(md, 0);
214 }
215 
220 {
221  BLI_assert(BLI_findindex(&ob->modifiers, md) != -1);
222 
223  if (md->flag & eModifierFlag_Active) {
224  /* Prefer the previous modifier but use the next if this modifier is the first in the list. */
225  if (md->next != NULL) {
227  }
228  else if (md->prev != NULL) {
230  }
231  }
232 
233  BLI_remlink(&ob->modifiers, md);
234 }
235 
237 {
239 }
240 
242 {
243  if (modifiers && md) {
244  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
245 
246  return BLI_uniquename(
247  modifiers, md, DATA_(mti->name), '.', offsetof(ModifierData, name), sizeof(md->name));
248  }
249  return false;
250 }
251 
253 {
254  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
255 
256  return mti->dependsOnTime && mti->dependsOnTime(md);
257 }
258 
260 {
261  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
262 
263  return (mti->type == eModifierTypeType_OnlyDeform ||
265 }
266 
268 {
269  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
270 
271  /* Constructive modifiers are highly likely to also modify data like vgroups or vcol! */
272  if (!((mti->flags & eModifierTypeFlag_UsesPreview) ||
274  return false;
275  }
276 
277  if (md->mode & eModifierMode_Realtime) {
278  return true;
279  }
280 
281  return false;
282 }
283 
285 {
286  LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
287  if (md->type == type) {
288  return md;
289  }
290  }
291  return NULL;
292 }
293 
294 ModifierData *BKE_modifiers_findby_name(const Object *ob, const char *name)
295 {
296  return BLI_findstring(&(ob->modifiers), name, offsetof(ModifierData, name));
297 }
298 
300 {
301  LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
302  if (md->error) {
303  MEM_freeN(md->error);
304  md->error = NULL;
305  }
306  }
307 }
308 
309 void BKE_modifiers_foreach_ID_link(Object *ob, IDWalkFunc walk, void *userData)
310 {
311  LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
312  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
313 
314  if (mti->foreachIDLink) {
315  mti->foreachIDLink(md, ob, walk, userData);
316  }
317  }
318 }
319 
320 void BKE_modifiers_foreach_tex_link(Object *ob, TexWalkFunc walk, void *userData)
321 {
322  LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
323  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
324 
325  if (mti->foreachTexLink) {
326  mti->foreachTexLink(md, ob, walk, userData);
327  }
328  }
329 }
330 
331 /* callback's can use this
332  * to avoid copying every member.
333  */
335  ModifierData *md_dst,
336  const int UNUSED(flag))
337 {
338  const ModifierTypeInfo *mti = BKE_modifier_get_info(md_src->type);
339 
340  /* md_dst may have already be fully initialized with some extra allocated data,
341  * we need to free it now to avoid memleak. */
342  if (mti->freeData) {
343  mti->freeData(md_dst);
344  }
345 
346  const size_t data_size = sizeof(ModifierData);
347  const char *md_src_data = ((const char *)md_src) + data_size;
348  char *md_dst_data = ((char *)md_dst) + data_size;
349  BLI_assert(data_size <= (size_t)mti->structSize);
350  memcpy(md_dst_data, md_src_data, (size_t)mti->structSize - data_size);
351 
352  /* Runtime fields are never to be preserved. */
353  md_dst->runtime = NULL;
354 }
355 
356 static void modifier_copy_data_id_us_cb(void *UNUSED(userData),
357  Object *UNUSED(ob),
358  ID **idpoin,
359  int cb_flag)
360 {
361  ID *id = *idpoin;
362  if (id != NULL && (cb_flag & IDWALK_CB_USER) != 0) {
363  id_us_plus(id);
364  }
365 }
366 
367 void BKE_modifier_copydata_ex(ModifierData *md, ModifierData *target, const int flag)
368 {
369  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
370 
371  target->mode = md->mode;
372  target->flag = md->flag;
373  target->ui_expand_flag = md->ui_expand_flag;
374 
375  if (mti->copyData) {
376  mti->copyData(md, target, flag);
377  }
378 
379  if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
380  if (mti->foreachIDLink) {
382  }
383  }
384 
385  if (flag & LIB_ID_CREATE_NO_MAIN) {
386  /* Make sure UUID is the same between the source and the target.
387  * This is needed in the cases when UUID is to be preserved and when there is no copyData
388  * callback, or the copyData does not do full byte copy of the modifier data. */
389  target->session_uuid = md->session_uuid;
390  }
391  else {
392  /* In the case copyData made full byte copy force UUID to be re-generated. */
394  }
395 }
396 
398 {
399  BKE_modifier_copydata_ex(md, target, 0);
400 }
401 
403 {
404  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
405 
406  return ((!mti->isDisabled || !mti->isDisabled(scene, md, 0)) &&
408 }
409 
411 {
412  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
413 
414  return ((md->mode & eModifierMode_Realtime) && (md->mode & eModifierMode_Editmode) &&
415  (!mti->isDisabled || !mti->isDisabled(scene, md, 0)) &&
417 }
418 
420 {
421  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
423 }
424 
426 {
427  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
428  return (mti->type == eModifierTypeType_NonGeometrical);
429 }
430 
431 void BKE_modifier_set_error(const Object *ob, ModifierData *md, const char *_format, ...)
432 {
433  char buffer[512];
434  va_list ap;
435  const char *format = TIP_(_format);
436 
437  va_start(ap, _format);
438  vsnprintf(buffer, sizeof(buffer), format, ap);
439  va_end(ap);
440  buffer[sizeof(buffer) - 1] = '\0';
441 
442  if (md->error) {
443  MEM_freeN(md->error);
444  }
445 
446  md->error = BLI_strdup(buffer);
447 
448 #ifndef NDEBUG
449  if ((md->mode & eModifierMode_Virtual) == 0) {
450  /* Ensure correct object is passed in. */
451  const Object *ob_orig = (Object *)DEG_get_original_id((ID *)&ob->id);
452  const ModifierData *md_orig = md->orig_modifier_data ? md->orig_modifier_data : md;
453  BLI_assert(BLI_findindex(&ob_orig->modifiers, md_orig) != -1);
454  }
455 #endif
456 
457  CLOG_ERROR(&LOG, "Object: \"%s\", Modifier: \"%s\", %s", ob->id.name + 2, md->name, md->error);
458 }
459 
460 /* used for buttons, to find out if the 'draw deformed in editmode' option is
461  * there
462  *
463  * also used in transform_conversion.c, to detect CrazySpace [tm] (2nd arg
464  * then is NULL)
465  * also used for some mesh tools to give warnings
466  */
468  Object *ob,
469  int *r_lastPossibleCageIndex,
470  bool is_virtual)
471 {
472  VirtualModifierData virtualModifierData;
473  ModifierData *md = (is_virtual) ?
474  BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData) :
475  ob->modifiers.first;
476 
477  if (r_lastPossibleCageIndex) {
478  /* ensure the value is initialized */
479  *r_lastPossibleCageIndex = -1;
480  }
481 
482  /* Find the last modifier acting on the cage. */
483  int cageIndex = -1;
484  for (int i = 0; md; i++, md = md->next) {
485  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
486  bool supports_mapping;
487 
488  if (mti->isDisabled && mti->isDisabled(scene, md, 0)) {
489  continue;
490  }
492  continue;
493  }
495  continue;
496  }
497 
498  supports_mapping = BKE_modifier_supports_mapping(md);
499  if (r_lastPossibleCageIndex && supports_mapping) {
500  *r_lastPossibleCageIndex = i;
501  }
502 
503  if (!(md->mode & eModifierMode_Realtime)) {
504  continue;
505  }
506  if (!(md->mode & eModifierMode_Editmode)) {
507  continue;
508  }
509 
510  if (!supports_mapping) {
511  break;
512  }
513 
514  if (md->mode & eModifierMode_OnCage) {
515  cageIndex = i;
516  }
517  }
518 
519  return cageIndex;
520 }
521 
523 {
525 
526  return (md && md->mode & (eModifierMode_Realtime | eModifierMode_Render));
527 }
528 
530 {
532 
533  return (md && md->mode & (eModifierMode_Realtime | eModifierMode_Render));
534 }
535 
536 bool BKE_modifiers_is_modifier_enabled(Object *ob, int modifierType)
537 {
538  ModifierData *md = BKE_modifiers_findby_type(ob, modifierType);
539 
540  return (md && md->mode & (eModifierMode_Realtime | eModifierMode_Render));
541 }
542 
544 {
546 
547  return (md && md->mode & (eModifierMode_Realtime | eModifierMode_Render));
548 }
549 
556 bool BKE_modifier_is_enabled(const struct Scene *scene, ModifierData *md, int required_mode)
557 {
558  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
559 
560  if ((md->mode & required_mode) != required_mode) {
561  return false;
562  }
563  if (scene != NULL && mti->isDisabled &&
564  mti->isDisabled(scene, md, required_mode == eModifierMode_Render)) {
565  return false;
566  }
568  return false;
569  }
570  if ((required_mode & eModifierMode_Editmode) &&
572  return false;
573  }
574 
575  return true;
576 }
577 
585 {
586  return (ID_IS_OVERRIDE_LIBRARY(ob) &&
587  (md == NULL || (md->flag & eModifierFlag_OverrideLibrary_Local) == 0));
588 }
589 
591  Object *ob,
592  ModifierData *md,
593  CustomData_MeshMasks *final_datamask,
594  int required_mode,
595  ModifierData *previewmd,
596  const CustomData_MeshMasks *previewmask)
597 {
598  CDMaskLink *dataMasks = NULL;
599  CDMaskLink *curr, *prev;
600  bool have_deform_modifier = false;
601 
602  /* build a list of modifier data requirements in reverse order */
603  for (; md; md = md->next) {
604  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
605 
606  curr = MEM_callocN(sizeof(CDMaskLink), "CDMaskLink");
607 
608  if (BKE_modifier_is_enabled(scene, md, required_mode)) {
609  if (mti->type == eModifierTypeType_OnlyDeform) {
610  have_deform_modifier = true;
611  }
612 
613  if (mti->requiredDataMask) {
614  mti->requiredDataMask(ob, md, &curr->mask);
615  }
616 
617  if (previewmd == md && previewmask != NULL) {
618  CustomData_MeshMasks_update(&curr->mask, previewmask);
619  }
620  }
621 
622  if (!have_deform_modifier) {
623  /* Don't create orco layer when there is no deformation, we fall
624  * back to regular vertex coordinates */
625  curr->mask.vmask &= ~CD_MASK_ORCO;
626  }
627 
628  /* prepend new datamask */
629  curr->next = dataMasks;
630  dataMasks = curr;
631  }
632 
633  if (!have_deform_modifier) {
634  final_datamask->vmask &= ~CD_MASK_ORCO;
635  }
636 
637  /* build the list of required data masks - each mask in the list must
638  * include all elements of the masks that follow it
639  *
640  * note the list is currently in reverse order, so "masks that follow it"
641  * actually means "masks that precede it" at the moment
642  */
643  for (curr = dataMasks, prev = NULL; curr; prev = curr, curr = curr->next) {
644  if (prev) {
645  CustomData_MeshMasks_update(&curr->mask, &prev->mask);
646  }
647  else {
648  CustomData_MeshMasks_update(&curr->mask, final_datamask);
649  }
650  }
651 
652  /* reverse the list so it's in the correct order */
653  BLI_linklist_reverse((LinkNode **)&dataMasks);
654 
655  return dataMasks;
656 }
657 
659  ModifierData *md,
660  int required_mode)
661 {
662  ModifierData *tmp_md = NULL;
663 
664  if ((required_mode & ~eModifierMode_Editmode) != eModifierMode_Realtime) {
665  return tmp_md;
666  }
667 
668  /* Find the latest modifier in stack generating preview. */
669  for (; md; md = md->next) {
670  if (BKE_modifier_is_enabled(scene, md, required_mode) && BKE_modifier_is_preview(md)) {
671  tmp_md = md;
672  }
673  }
674  return tmp_md;
675 }
676 
677 /* This is to include things that are not modifiers in the evaluation of the modifier stack, for
678  * example parenting to an armature. */
680  VirtualModifierData *virtualModifierData)
681 {
682  ModifierData *md = ob->modifiers.first;
683 
684  *virtualModifierData = virtualModifierCommonData;
685 
686  if (ob->parent) {
687  if (ob->parent->type == OB_ARMATURE && ob->partype == PARSKEL) {
688  virtualModifierData->amd.object = ob->parent;
689  virtualModifierData->amd.modifier.next = md;
690  virtualModifierData->amd.deformflag = ((bArmature *)(ob->parent->data))->deformflag;
691  md = &virtualModifierData->amd.modifier;
692  }
693  else if (ob->parent->type == OB_CURVE && ob->partype == PARSKEL) {
694  virtualModifierData->cmd.object = ob->parent;
695  virtualModifierData->cmd.defaxis = ob->trackflag + 1;
696  virtualModifierData->cmd.modifier.next = md;
697  md = &virtualModifierData->cmd.modifier;
698  }
699  else if (ob->parent->type == OB_LATTICE && ob->partype == PARSKEL) {
700  virtualModifierData->lmd.object = ob->parent;
701  virtualModifierData->lmd.modifier.next = md;
702  md = &virtualModifierData->lmd.modifier;
703  }
704  }
705 
706  /* shape key modifier, not yet for curves */
707  if (ELEM(ob->type, OB_MESH, OB_LATTICE) && BKE_key_from_object(ob)) {
708  if (ob->type == OB_MESH && (ob->shapeflag & OB_SHAPE_EDIT_MODE)) {
709  virtualModifierData->smd.modifier.mode |= eModifierMode_Editmode | eModifierMode_OnCage;
710  }
711  else {
712  virtualModifierData->smd.modifier.mode &= ~eModifierMode_Editmode | eModifierMode_OnCage;
713  }
714 
715  virtualModifierData->smd.modifier.next = md;
716  md = &virtualModifierData->smd.modifier;
717  }
718 
719  return md;
720 }
721 
722 /* Takes an object and returns its first selected armature, else just its armature
723  * This should work for multiple armatures per object
724  */
726 {
727  if (ob->type == OB_GPENCIL) {
728  GpencilVirtualModifierData gpencilvirtualModifierData;
731  ob, &gpencilvirtualModifierData);
732 
733  /* return the first selected armature, this lets us use multiple armatures */
734  for (; gmd; gmd = gmd->next) {
735  if (gmd->type == eGpencilModifierType_Armature) {
736  agmd = (ArmatureGpencilModifierData *)gmd;
737  if (agmd->object && (agmd->object->base_flag & BASE_SELECTED)) {
738  return agmd->object;
739  }
740  }
741  }
742  /* If we're still here then return the last armature. */
743  if (agmd) {
744  return agmd->object;
745  }
746  }
747  else {
748  VirtualModifierData virtualModifierData;
749  ArmatureModifierData *amd = NULL;
750  ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData);
751 
752  /* return the first selected armature, this lets us use multiple armatures */
753  for (; md; md = md->next) {
754  if (md->type == eModifierType_Armature) {
755  amd = (ArmatureModifierData *)md;
756  if (amd->object && (amd->object->base_flag & BASE_SELECTED)) {
757  return amd->object;
758  }
759  }
760  }
761  /* If we're still here then return the last armature. */
762  if (amd) {
763  return amd->object;
764  }
765  }
766 
767  return NULL;
768 }
769 
771 {
772  VirtualModifierData virtualModifierData;
773  ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData);
775 
776  /* return the first selected armature, this lets us use multiple armatures */
777  for (; md; md = md->next) {
778  if (md->type == eModifierType_MeshDeform) {
779  mdmd = (MeshDeformModifierData *)md;
780  if (mdmd->object && (mdmd->object->base_flag & BASE_SELECTED)) {
781  return mdmd->object;
782  }
783  }
784  }
785 
786  if (mdmd) { /* if we're still here then return the last armature */
787  return mdmd->object;
788  }
789 
790  return NULL;
791 }
792 
793 /* Takes an object and returns its first selected lattice, else just its lattice
794  * This should work for multiple lattices per object
795  */
797 {
798  VirtualModifierData virtualModifierData;
799  ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData);
800  LatticeModifierData *lmd = NULL;
801 
802  /* return the first selected lattice, this lets us use multiple lattices */
803  for (; md; md = md->next) {
804  if (md->type == eModifierType_Lattice) {
805  lmd = (LatticeModifierData *)md;
806  if (lmd->object && (lmd->object->base_flag & BASE_SELECTED)) {
807  return lmd->object;
808  }
809  }
810  }
811 
812  if (lmd) { /* if we're still here then return the last lattice */
813  return lmd->object;
814  }
815 
816  return NULL;
817 }
818 
819 /* Takes an object and returns its first selected curve, else just its curve
820  * This should work for multiple curves per object
821  */
823 {
824  VirtualModifierData virtualModifierData;
825  ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData);
826  CurveModifierData *cmd = NULL;
827 
828  /* return the first selected curve, this lets us use multiple curves */
829  for (; md; md = md->next) {
830  if (md->type == eModifierType_Curve) {
831  cmd = (CurveModifierData *)md;
832  if (cmd->object && (cmd->object->base_flag & BASE_SELECTED)) {
833  return cmd->object;
834  }
835  }
836  }
837 
838  if (cmd) { /* if we're still here then return the last curve */
839  return cmd->object;
840  }
841 
842  return NULL;
843 }
844 
846 {
847  VirtualModifierData virtualModifierData;
848  ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData);
849  MultiresModifierData *mmd = NULL;
850 
851  for (; md; md = md->next) {
852  if (md->type == eModifierType_Multires) {
853  mmd = (MultiresModifierData *)md;
854  if (mmd->totlvl != 0) {
855  return true;
856  }
857  }
858  }
859  return false;
860 }
861 
863 {
864  VirtualModifierData virtualModifierData;
865  ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData);
866 
867  for (; md; md = md->next) {
868  if (md->type == eModifierType_Armature) {
870  if (amd->object && amd->object->data == arm) {
871  return true;
872  }
873  }
874  }
875 
876  return false;
877 }
878 
880 {
881  /* Search (backward) in the modifier stack to find if we have a subsurf modifier (enabled) before
882  * the last modifier displayed on cage (or if the subsurf is the last). */
883  VirtualModifierData virtualModifierData;
884  ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData);
885  int cage_index = BKE_modifiers_get_cage_index(scene, ob, NULL, 1);
886  if (cage_index == -1) {
887  return false;
888  }
889  /* Find first modifier enabled on cage. */
890  for (int i = 0; md && i < cage_index; i++) {
891  md = md->next;
892  }
893  /* Now from this point, search for subsurf modifier. */
894  for (; md; md = md->prev) {
895  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
896  if (md->type == eModifierType_Subsurf) {
898  if (BKE_modifier_is_enabled(scene, md, mode)) {
899  return true;
900  }
901  }
902  else if (mti->type == eModifierTypeType_OnlyDeform) {
903  /* These modifiers do not reset the subdiv flag nor change the topology.
904  * We can still search for a subsurf modifier. */
905  }
906  else {
907  /* Other modifiers may reset the subdiv facedot flag or create. */
908  return false;
909  }
910  }
911  return false;
912 }
913 
915 {
916  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
917  return mti->deformMatricesEM != NULL;
918 }
919 
921 {
922  VirtualModifierData virtualModifierData;
923  ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData);
924  int required_mode = eModifierMode_Realtime;
925 
926  if (ob->mode == OB_MODE_EDIT) {
927  required_mode |= eModifierMode_Editmode;
928  }
929  for (; md; md = md->next) {
930  if (!BKE_modifier_is_enabled(scene, md, required_mode)) {
931  /* pass */
932  }
934  return true;
935  }
936  }
937  return false;
938 }
939 
941 {
942  if (md->type == eModifierType_Armature) {
944 
946  }
947 }
948 
949 /* ensure modifier correctness when changing ob->data */
951 {
952  ModifierData *md;
953 
954  /* just multires checked for now, since only multires
955  * modifies mesh data */
956 
957  if (ob->type != OB_MESH) {
958  return;
959  }
960 
961  for (md = ob->modifiers.first; md; md = md->next) {
962  if (md->type == eModifierType_Multires) {
964 
966  }
967  }
968 }
969 
970 /* where should this go?, it doesn't fit well anywhere :S - campbell */
971 
972 /* elubie: changed this to default to the same dir as the render output
973  * to prevent saving to C:\ on Windows */
974 
975 /* campbell: logic behind this...
976  *
977  * - if the ID is from a library, return library path
978  * - else if the file has been saved return the blend file path.
979  * - else if the file isn't saved and the ID isn't from a library, return the temp dir.
980  */
981 const char *BKE_modifier_path_relbase(Main *bmain, Object *ob)
982 {
983  if (G.relbase_valid || ID_IS_LINKED(ob)) {
984  return ID_BLEND_PATH(bmain, &ob->id);
985  }
986 
987  /* last resort, better than using "" which resolves to the current
988  * working directory */
989  return BKE_tempdir_session();
990 }
991 
993 {
994  if (G.relbase_valid || ID_IS_LINKED(ob)) {
995  return ID_BLEND_PATH_FROM_GLOBAL(&ob->id);
996  }
997 
998  /* last resort, better than using "" which resolves to the current
999  * working directory */
1000  return BKE_tempdir_session();
1001 }
1002 
1003 /* initializes the path with either */
1004 void BKE_modifier_path_init(char *path, int path_maxlen, const char *name)
1005 {
1006  /* elubie: changed this to default to the same dir as the render output
1007  * to prevent saving to C:\ on Windows */
1008  BLI_join_dirfile(path, path_maxlen, G.relbase_valid ? "//" : BKE_tempdir_session(), name);
1009 }
1010 
1015 {
1016  switch ((eMeshWrapperType)me->runtime.wrapper_type) {
1017  case ME_WRAPPER_TYPE_BMESH: {
1018  EditMeshData *edit_data = me->runtime.edit_data;
1019  if (edit_data->vertexCos) {
1020  /* Note that 'ensure' is acceptable here since these values aren't modified in-place.
1021  * If that changes we'll need to recalculate. */
1023  }
1024  else {
1026  }
1027  break;
1028  }
1029  case ME_WRAPPER_TYPE_MDATA:
1031  break;
1032  }
1033 }
1034 
1035 /* wrapper around ModifierTypeInfo.modifyMesh that ensures valid normals */
1036 
1038  const ModifierEvalContext *ctx,
1039  struct Mesh *me)
1040 {
1041  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
1042  BLI_assert(CustomData_has_layer(&me->pdata, CD_NORMAL) == false);
1043 
1045  if ((mti->flags & eModifierTypeFlag_AcceptsBMesh) == 0) {
1047  }
1048  }
1049 
1050  if (mti->dependsOnNormals && mti->dependsOnNormals(md)) {
1052  }
1053  return mti->modifyMesh(md, ctx, me);
1054 }
1055 
1057  const ModifierEvalContext *ctx,
1058  Mesh *me,
1059  float (*vertexCos)[3],
1060  int numVerts)
1061 {
1062  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
1063  BLI_assert(!me || CustomData_has_layer(&me->pdata, CD_NORMAL) == false);
1064 
1065  if (me && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
1067  }
1068  mti->deformVerts(md, ctx, me, vertexCos, numVerts);
1069 }
1070 
1072  const ModifierEvalContext *ctx,
1073  struct BMEditMesh *em,
1074  Mesh *me,
1075  float (*vertexCos)[3],
1076  int numVerts)
1077 {
1078  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
1079  BLI_assert(!me || CustomData_has_layer(&me->pdata, CD_NORMAL) == false);
1080 
1081  if (me && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
1083  }
1084  mti->deformVertsEM(md, ctx, em, me, vertexCos, numVerts);
1085 }
1086 
1087 /* end modifier callback wrappers */
1088 
1099  const bool get_cage_mesh)
1100 {
1101  Mesh *me = NULL;
1102 
1103  if ((ob_eval->type == OB_MESH) && (ob_eval->mode & OB_MODE_EDIT)) {
1104  /* In EditMode, evaluated mesh is stored in BMEditMesh, not the object... */
1105  BMEditMesh *em = BKE_editmesh_from_object(ob_eval);
1106  /* 'em' might not exist yet in some cases, just after loading a .blend file, see T57878. */
1107  if (em != NULL) {
1108  me = (get_cage_mesh && em->mesh_eval_cage != NULL) ? em->mesh_eval_cage :
1109  em->mesh_eval_final;
1110  }
1111  }
1112  if (me == NULL) {
1113  me = (get_cage_mesh && ob_eval->runtime.mesh_deform_eval != NULL) ?
1114  ob_eval->runtime.mesh_deform_eval :
1116  }
1117 
1118  return me;
1119 }
1120 
1122 {
1123  if (md->orig_modifier_data == NULL) {
1124  return md;
1125  }
1126  return md->orig_modifier_data;
1127 }
1128 
1130  Object *object,
1131  ModifierData *md)
1132 {
1133  Object *object_eval = DEG_get_evaluated_object(depsgraph, object);
1134  if (object_eval == object) {
1135  return md;
1136  }
1137  return BKE_modifiers_findby_name(object_eval, md->name);
1138 }
1139 
1141 {
1142  struct GSet *used_uuids = BLI_gset_new(
1144 
1145  LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
1146  const SessionUUID *session_uuid = &md->session_uuid;
1147  if (!BLI_session_uuid_is_generated(session_uuid)) {
1148  printf("Modifier %s -> %s does not have UUID generated.\n", object->id.name + 2, md->name);
1149  continue;
1150  }
1151 
1152  if (BLI_gset_lookup(used_uuids, session_uuid) != NULL) {
1153  printf("Modifier %s -> %s has duplicate UUID generated.\n", object->id.name + 2, md->name);
1154  continue;
1155  }
1156 
1157  BLI_gset_insert(used_uuids, (void *)session_uuid);
1158  }
1159 
1160  BLI_gset_free(used_uuids, NULL);
1161 }
1162 
1164 {
1165  if (modbase == NULL) {
1166  return;
1167  }
1168 
1169  LISTBASE_FOREACH (ModifierData *, md, modbase) {
1170  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
1171  if (mti == NULL) {
1172  return;
1173  }
1174 
1175  BLO_write_struct_by_name(writer, mti->structName, md);
1176 
1177  if (md->type == eModifierType_Cloth) {
1178  ClothModifierData *clmd = (ClothModifierData *)md;
1179 
1183  BKE_ptcache_blend_write(writer, &clmd->ptcaches);
1184  }
1185  else if (md->type == eModifierType_Fluid) {
1186  FluidModifierData *fmd = (FluidModifierData *)md;
1187 
1188  if (fmd->type & MOD_FLUID_TYPE_DOMAIN) {
1190 
1191  if (fmd->domain) {
1192  BKE_ptcache_blend_write(writer, &(fmd->domain->ptcaches[0]));
1193 
1194  /* create fake pointcache so that old blender versions can read it */
1195  fmd->domain->point_cache[1] = BKE_ptcache_add(&fmd->domain->ptcaches[1]);
1197  fmd->domain->point_cache[1]->step = 1;
1198 
1199  BKE_ptcache_blend_write(writer, &(fmd->domain->ptcaches[1]));
1200 
1201  if (fmd->domain->coba) {
1202  BLO_write_struct(writer, ColorBand, fmd->domain->coba);
1203  }
1204 
1205  /* cleanup the fake pointcache */
1207  fmd->domain->point_cache[1] = NULL;
1208 
1210  }
1211  }
1212  else if (fmd->type & MOD_FLUID_TYPE_FLOW) {
1213  BLO_write_struct(writer, FluidFlowSettings, fmd->flow);
1214  }
1215  else if (fmd->type & MOD_FLUID_TYPE_EFFEC) {
1217  }
1218  }
1219  else if (md->type == eModifierType_Fluidsim) {
1220  FluidsimModifierData *fluidmd = (FluidsimModifierData *)md;
1221 
1222  BLO_write_struct(writer, FluidsimSettings, fluidmd->fss);
1223  }
1224  else if (md->type == eModifierType_DynamicPaint) {
1226 
1227  if (pmd->canvas) {
1229 
1230  /* write surfaces */
1233  }
1234  /* write caches and effector weights */
1236  BKE_ptcache_blend_write(writer, &(surface->ptcaches));
1237 
1238  BLO_write_struct(writer, EffectorWeights, surface->effector_weights);
1239  }
1240  }
1241  if (pmd->brush) {
1243  BLO_write_struct(writer, ColorBand, pmd->brush->paint_ramp);
1244  BLO_write_struct(writer, ColorBand, pmd->brush->vel_ramp);
1245  }
1246  }
1247  else if (md->type == eModifierType_Collision) {
1248 
1249 #if 0
1251  // TODO: CollisionModifier should use pointcache
1252  // + have proper reset events before enabling this
1253  writestruct(wd, DATA, MVert, collmd->numverts, collmd->x);
1254  writestruct(wd, DATA, MVert, collmd->numverts, collmd->xnew);
1255  writestruct(wd, DATA, MFace, collmd->numfaces, collmd->mfaces);
1256 #endif
1257  }
1258 
1259  if (mti->blendWrite != NULL) {
1260  mti->blendWrite(writer, md);
1261  }
1262  }
1263 }
1264 
1265 /* TODO(sergey): Find a better place for this.
1266  *
1267  * Unfortunately, this can not be done as a regular do_versions() since the modifier type is
1268  * set to NONE, so the do_versions code wouldn't know where the modifier came from.
1269  *
1270  * The best approach seems to have the functionality in versioning_280.c but still call the
1271  * function from #BKE_modifier_blend_read_data().
1272  */
1273 
1274 /* Domain, inflow, ... */
1275 static void modifier_ensure_type(FluidModifierData *fluid_modifier_data, int type)
1276 {
1277  fluid_modifier_data->type = type;
1278  BKE_fluid_modifier_free(fluid_modifier_data);
1279  BKE_fluid_modifier_create_type_data(fluid_modifier_data);
1280 }
1281 
1288  Object *object,
1289  ListBase *modifiers,
1290  ModifierData *old_modifier_data)
1291 {
1292  ModifierData *new_modifier_data = BKE_modifier_new(eModifierType_Fluid);
1293  FluidModifierData *fluid_modifier_data = (FluidModifierData *)new_modifier_data;
1294 
1295  if (old_modifier_data->type == eModifierType_Fluidsim) {
1296  FluidsimModifierData *old_fluidsim_modifier_data = (FluidsimModifierData *)old_modifier_data;
1297  FluidsimSettings *old_fluidsim_settings = BLO_read_get_new_data_address(
1298  reader, old_fluidsim_modifier_data->fss);
1299  switch (old_fluidsim_settings->type) {
1300  case OB_FLUIDSIM_ENABLE:
1301  modifier_ensure_type(fluid_modifier_data, 0);
1302  break;
1303  case OB_FLUIDSIM_DOMAIN:
1304  modifier_ensure_type(fluid_modifier_data, MOD_FLUID_TYPE_DOMAIN);
1305  BKE_fluid_domain_type_set(object, fluid_modifier_data->domain, FLUID_DOMAIN_TYPE_LIQUID);
1306  break;
1307  case OB_FLUIDSIM_FLUID:
1308  modifier_ensure_type(fluid_modifier_data, MOD_FLUID_TYPE_FLOW);
1309  BKE_fluid_flow_type_set(object, fluid_modifier_data->flow, FLUID_FLOW_TYPE_LIQUID);
1310  /* No need to emit liquid far away from surface. */
1311  fluid_modifier_data->flow->surface_distance = 0.0f;
1312  break;
1313  case OB_FLUIDSIM_OBSTACLE:
1314  modifier_ensure_type(fluid_modifier_data, MOD_FLUID_TYPE_EFFEC);
1316  object, fluid_modifier_data->effector, FLUID_EFFECTOR_TYPE_COLLISION);
1317  break;
1318  case OB_FLUIDSIM_INFLOW:
1319  modifier_ensure_type(fluid_modifier_data, MOD_FLUID_TYPE_FLOW);
1320  BKE_fluid_flow_type_set(object, fluid_modifier_data->flow, FLUID_FLOW_TYPE_LIQUID);
1321  BKE_fluid_flow_behavior_set(object, fluid_modifier_data->flow, FLUID_FLOW_BEHAVIOR_INFLOW);
1322  /* No need to emit liquid far away from surface. */
1323  fluid_modifier_data->flow->surface_distance = 0.0f;
1324  break;
1325  case OB_FLUIDSIM_OUTFLOW:
1326  modifier_ensure_type(fluid_modifier_data, MOD_FLUID_TYPE_FLOW);
1327  BKE_fluid_flow_type_set(object, fluid_modifier_data->flow, FLUID_FLOW_TYPE_LIQUID);
1329  object, fluid_modifier_data->flow, FLUID_FLOW_BEHAVIOR_OUTFLOW);
1330  break;
1331  case OB_FLUIDSIM_PARTICLE:
1332  /* "Particle" type objects not being used by Mantaflow fluid simulations.
1333  * Skip this object, secondary particles can only be enabled through the domain object. */
1334  break;
1335  case OB_FLUIDSIM_CONTROL:
1336  /* "Control" type objects not being used by Mantaflow fluid simulations.
1337  * Use guiding type instead which is similar. */
1338  modifier_ensure_type(fluid_modifier_data, MOD_FLUID_TYPE_EFFEC);
1340  object, fluid_modifier_data->effector, FLUID_EFFECTOR_TYPE_GUIDE);
1341  break;
1342  }
1343  }
1344  else if (old_modifier_data->type == eModifierType_Smoke) {
1345  SmokeModifierData *old_smoke_modifier_data = (SmokeModifierData *)old_modifier_data;
1346  modifier_ensure_type(fluid_modifier_data, old_smoke_modifier_data->type);
1347  if (fluid_modifier_data->type == MOD_FLUID_TYPE_DOMAIN) {
1348  BKE_fluid_domain_type_set(object, fluid_modifier_data->domain, FLUID_DOMAIN_TYPE_GAS);
1349  }
1350  else if (fluid_modifier_data->type == MOD_FLUID_TYPE_FLOW) {
1351  BKE_fluid_flow_type_set(object, fluid_modifier_data->flow, FLUID_FLOW_TYPE_SMOKE);
1352  }
1353  else if (fluid_modifier_data->type == MOD_FLUID_TYPE_EFFEC) {
1355  object, fluid_modifier_data->effector, FLUID_EFFECTOR_TYPE_COLLISION);
1356  }
1357  }
1358 
1359  /* Replace modifier data in the stack. */
1360  new_modifier_data->next = old_modifier_data->next;
1361  new_modifier_data->prev = old_modifier_data->prev;
1362  if (new_modifier_data->prev != NULL) {
1363  new_modifier_data->prev->next = new_modifier_data;
1364  }
1365  if (new_modifier_data->next != NULL) {
1366  new_modifier_data->next->prev = new_modifier_data;
1367  }
1368  if (modifiers->first == old_modifier_data) {
1369  modifiers->first = new_modifier_data;
1370  }
1371  if (modifiers->last == old_modifier_data) {
1372  modifiers->last = new_modifier_data;
1373  }
1374 
1375  /* Free old modifier data. */
1376  MEM_freeN(old_modifier_data);
1377 
1378  return new_modifier_data;
1379 }
1380 
1382 {
1383  BLO_read_list(reader, lb);
1384 
1385  LISTBASE_FOREACH (ModifierData *, md, lb) {
1387 
1388  md->error = NULL;
1389  md->runtime = NULL;
1390 
1391  /* Modifier data has been allocated as a part of data migration process and
1392  * no reading of nested fields from file is needed. */
1393  bool is_allocated = false;
1394 
1395  if (md->type == eModifierType_Fluidsim) {
1397  BLO_read_data_reports(reader),
1398  RPT_WARNING,
1399  TIP_("Possible data loss when saving this file! %s modifier is deprecated (Object: %s)"),
1400  md->name,
1401  ob->id.name + 2);
1402  md = modifier_replace_with_fluid(reader, ob, lb, md);
1403  is_allocated = true;
1404  }
1405  else if (md->type == eModifierType_Smoke) {
1407  BLO_read_data_reports(reader),
1408  RPT_WARNING,
1409  TIP_("Possible data loss when saving this file! %s modifier is deprecated (Object: %s)"),
1410  md->name,
1411  ob->id.name + 2);
1412  md = modifier_replace_with_fluid(reader, ob, lb, md);
1413  is_allocated = true;
1414  }
1415 
1416  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
1417 
1418  /* if modifiers disappear, or for upward compatibility */
1419  if (mti == NULL) {
1420  md->type = eModifierType_None;
1421  }
1422 
1423  if (is_allocated) {
1424  /* All the fields has been properly allocated. */
1425  }
1426  else if (md->type == eModifierType_Cloth) {
1427  ClothModifierData *clmd = (ClothModifierData *)md;
1428 
1429  clmd->clothObject = NULL;
1430  clmd->hairdata = NULL;
1431 
1432  BLO_read_data_address(reader, &clmd->sim_parms);
1433  BLO_read_data_address(reader, &clmd->coll_parms);
1434 
1435  BKE_ptcache_blend_read_data(reader, &clmd->ptcaches, &clmd->point_cache, 0);
1436 
1437  if (clmd->sim_parms) {
1438  if (clmd->sim_parms->presets > 10) {
1439  clmd->sim_parms->presets = 0;
1440  }
1441 
1442  clmd->sim_parms->reset = 0;
1443 
1445 
1446  if (!clmd->sim_parms->effector_weights) {
1448  }
1449  }
1450 
1451  clmd->solver_result = NULL;
1452  }
1453  else if (md->type == eModifierType_Fluid) {
1454 
1455  FluidModifierData *fmd = (FluidModifierData *)md;
1456 
1457  if (fmd->type == MOD_FLUID_TYPE_DOMAIN) {
1458  fmd->flow = NULL;
1459  fmd->effector = NULL;
1460  BLO_read_data_address(reader, &fmd->domain);
1461  fmd->domain->fmd = fmd;
1462 
1463  fmd->domain->fluid = NULL;
1465  fmd->domain->tex_density = NULL;
1466  fmd->domain->tex_color = NULL;
1467  fmd->domain->tex_shadow = NULL;
1468  fmd->domain->tex_flame = NULL;
1469  fmd->domain->tex_flame_coba = NULL;
1470  fmd->domain->tex_coba = NULL;
1471  fmd->domain->tex_field = NULL;
1472  fmd->domain->tex_velocity_x = NULL;
1473  fmd->domain->tex_velocity_y = NULL;
1474  fmd->domain->tex_velocity_z = NULL;
1475  fmd->domain->tex_wt = NULL;
1476  fmd->domain->mesh_velocities = NULL;
1477  BLO_read_data_address(reader, &fmd->domain->coba);
1478 
1480  if (!fmd->domain->effector_weights) {
1482  }
1483 
1485  reader, &(fmd->domain->ptcaches[0]), &(fmd->domain->point_cache[0]), 1);
1486 
1487  /* Manta sim uses only one cache from now on, so store pointer convert */
1488  if (fmd->domain->ptcaches[1].first || fmd->domain->point_cache[1]) {
1489  if (fmd->domain->point_cache[1]) {
1490  PointCache *cache = BLO_read_get_new_data_address(reader, fmd->domain->point_cache[1]);
1491  if (cache->flag & PTCACHE_FAKE_SMOKE) {
1492  /* Manta-sim/smoke was already saved in "new format" and this cache is a fake one. */
1493  }
1494  else {
1495  printf(
1496  "High resolution manta cache not available due to pointcache update. Please "
1497  "reset the simulation.\n");
1498  }
1499  BKE_ptcache_free(cache);
1500  }
1501  BLI_listbase_clear(&fmd->domain->ptcaches[1]);
1502  fmd->domain->point_cache[1] = NULL;
1503  }
1504  }
1505  else if (fmd->type == MOD_FLUID_TYPE_FLOW) {
1506  fmd->domain = NULL;
1507  fmd->effector = NULL;
1508  BLO_read_data_address(reader, &fmd->flow);
1509  fmd->flow->fmd = fmd;
1510  fmd->flow->mesh = NULL;
1511  fmd->flow->verts_old = NULL;
1512  fmd->flow->numverts = 0;
1513  BLO_read_data_address(reader, &fmd->flow->psys);
1514  }
1515  else if (fmd->type == MOD_FLUID_TYPE_EFFEC) {
1516  fmd->flow = NULL;
1517  fmd->domain = NULL;
1518  BLO_read_data_address(reader, &fmd->effector);
1519  if (fmd->effector) {
1520  fmd->effector->fmd = fmd;
1521  fmd->effector->verts_old = NULL;
1522  fmd->effector->numverts = 0;
1523  fmd->effector->mesh = NULL;
1524  }
1525  else {
1526  fmd->type = 0;
1527  fmd->flow = NULL;
1528  fmd->domain = NULL;
1529  fmd->effector = NULL;
1530  }
1531  }
1532  }
1533  else if (md->type == eModifierType_DynamicPaint) {
1535 
1536  if (pmd->canvas) {
1537  BLO_read_data_address(reader, &pmd->canvas);
1538  pmd->canvas->pmd = pmd;
1539  pmd->canvas->flags &= ~MOD_DPAINT_BAKING; /* just in case */
1540 
1541  if (pmd->canvas->surfaces.first) {
1542  BLO_read_list(reader, &pmd->canvas->surfaces);
1543 
1545  surface->canvas = pmd->canvas;
1546  surface->data = NULL;
1547  BKE_ptcache_blend_read_data(reader, &(surface->ptcaches), &(surface->pointcache), 1);
1548 
1549  BLO_read_data_address(reader, &surface->effector_weights);
1550  if (surface->effector_weights == NULL) {
1551  surface->effector_weights = BKE_effector_add_weights(NULL);
1552  }
1553  }
1554  }
1555  }
1556  if (pmd->brush) {
1557  BLO_read_data_address(reader, &pmd->brush);
1558  pmd->brush->pmd = pmd;
1559  BLO_read_data_address(reader, &pmd->brush->psys);
1560  BLO_read_data_address(reader, &pmd->brush->paint_ramp);
1561  BLO_read_data_address(reader, &pmd->brush->vel_ramp);
1562  }
1563  }
1564 
1565  if ((mti != NULL) && (mti->blendRead != NULL)) {
1566  mti->blendRead(reader, md);
1567  }
1568  }
1569 }
1570 
1572 {
1574 
1575  /* If linking from a library, clear 'local' library override flag. */
1576  if (ob->id.lib != NULL) {
1579  }
1580  }
1581 }
bool CustomData_has_layer(const struct CustomData *data, int type)
void CustomData_MeshMasks_update(CustomData_MeshMasks *mask_dst, const CustomData_MeshMasks *mask_src)
Definition: customdata.c:76
BMEditMesh * BKE_editmesh_from_object(struct Object *ob)
Return the BMEditMesh for a given object.
Definition: editmesh.c:85
void BKE_editmesh_cache_ensure_vert_normals(struct BMEditMesh *em, struct EditMeshData *emd)
struct EffectorWeights * BKE_effector_add_weights(struct Collection *collection)
Definition: effect.c:73
void BKE_fluid_flow_behavior_set(struct Object *object, struct FluidFlowSettings *settings, int behavior)
void BKE_fluid_effector_type_set(struct Object *object, struct FluidEffectorSettings *settings, int type)
void BKE_fluid_domain_type_set(struct Object *object, struct FluidDomainSettings *settings, int type)
Definition: fluid.c:4658
void BKE_fluid_modifier_create_type_data(struct FluidModifierData *fmd)
Definition: fluid.c:4892
void BKE_fluid_flow_type_set(struct Object *object, struct FluidFlowSettings *settings, int type)
Definition: fluid.c:4690
void BKE_fluid_modifier_free(struct FluidModifierData *fmd)
Definition: fluid.c:4881
struct GpencilModifierData * BKE_gpencil_modifiers_get_virtual_modifierlist(const struct Object *ob, struct GpencilVirtualModifierData *data)
struct Key * BKE_key_from_object(const struct Object *ob)
void id_us_min(struct ID *id)
Definition: lib_id.c:297
@ LIB_ID_CREATE_NO_USER_REFCOUNT
Definition: BKE_lib_id.h:92
@ LIB_ID_CREATE_NO_MAIN
Definition: BKE_lib_id.h:88
void id_us_plus(struct ID *id)
Definition: lib_id.c:288
@ IDWALK_CB_USER
Definition: BKE_lib_query.h:87
void BKE_mesh_calc_normals(struct Mesh *me)
void BKE_mesh_wrapper_ensure_mdata(struct Mesh *me)
Definition: mesh_wrapper.c:98
#define MODIFIER_TYPE_PANEL_PREFIX
Definition: BKE_modifier.h:400
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
Definition: BKE_modifier.h:120
@ eModifierTypeFlag_AcceptsBMesh
Definition: BKE_modifier.h:117
@ eModifierTypeFlag_SupportsMapping
Definition: BKE_modifier.h:82
@ eModifierTypeFlag_UsesPreview
Definition: BKE_modifier.h:113
@ eModifierTypeFlag_EnableInEditmode
Definition: BKE_modifier.h:92
@ eModifierTypeFlag_SupportsEditmode
Definition: BKE_modifier.h:83
void(* TexWalkFunc)(void *userData, struct Object *ob, struct ModifierData *md, const char *propname)
Definition: BKE_modifier.h:121
@ eModifierTypeType_OnlyDeform
Definition: BKE_modifier.h:58
@ eModifierTypeType_NonGeometrical
Definition: BKE_modifier.h:76
@ eModifierTypeType_Constructive
Definition: BKE_modifier.h:61
void multiresModifier_set_levels_from_disps(struct MultiresModifierData *mmd, struct Object *ob)
Definition: multires.c:529
General operations, lookup, etc. for blender objects.
void BKE_object_modifiers_lib_link_common(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
Definition: object.c:5706
struct Mesh * BKE_object_get_evaluated_mesh(struct Object *object)
Definition: object.c:4459
void BKE_object_modifier_set_active(struct Object *ob, struct ModifierData *md)
Definition: object.c:1284
void BKE_ptcache_blend_read_data(struct BlendDataReader *reader, struct ListBase *ptcaches, struct PointCache **ocache, int force_disk)
Definition: pointcache.c:3921
struct PointCache * BKE_ptcache_add(struct ListBase *ptcaches)
Definition: pointcache.c:3072
void BKE_ptcache_free_list(struct ListBase *ptcaches)
Definition: pointcache.c:3110
void BKE_ptcache_free(struct PointCache *cache)
Definition: pointcache.c:3099
void BKE_ptcache_blend_write(struct BlendWriter *writer, struct ListBase *ptcaches)
Definition: pointcache.c:3845
#define BLI_assert(a)
Definition: BLI_assert.h:58
struct GSet GSet
Definition: BLI_ghash.h:189
GSet * BLI_gset_new(GSetHashFP hashfp, GSetCmpFP cmpfp, const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:1125
void BLI_gset_insert(GSet *gs, void *key)
Definition: BLI_ghash.c:1147
void * BLI_gset_lookup(GSet *gs, const void *key) ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:1280
void BLI_gset_free(GSet *gs, GSetKeyFreeFP keyfreefp)
Definition: BLI_ghash.c:1253
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:172
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
Definition: BLI_listbase.h:128
void * BLI_findstring(const struct ListBase *listbase, const char *id, const int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:133
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_join_dirfile(char *__restrict dst, const size_t maxlen, const char *__restrict dir, const char *__restrict file) ATTR_NONNULL()
Definition: path_util.c:1737
bool BLI_session_uuid_ghash_compare(const void *lhs_v, const void *rhs_v)
Definition: session_uuid.c:73
SessionUUID BLI_session_uuid_generate(void)
Definition: session_uuid.c:36
uint BLI_session_uuid_ghash_hash(const void *uuid_v)
Definition: session_uuid.c:67
bool BLI_session_uuid_is_generated(const SessionUUID *uuid)
Definition: session_uuid.c:52
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL() ATTR_MALLOC
Definition: string.c:70
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL()
Definition: string.c:108
bool BLI_uniquename(struct ListBase *list, void *vlink, const char *defname, char delim, int name_offset, size_t len)
Definition: string_utils.c:381
ThreadRWMutex * BLI_rw_mutex_alloc(void)
Definition: threads.cc:536
#define UNUSED(x)
#define ELEM(...)
@ DATA
#define BLO_read_data_address(reader, ptr_p)
void BLO_reportf_wrap(struct ReportList *reports, ReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BLO_write_struct_by_name(BlendWriter *writer, const char *struct_name, const void *data_ptr)
Definition: writefile.c:1291
struct ReportList * BLO_read_data_reports(BlendDataReader *reader)
Definition: readfile.c:5785
#define BLO_write_struct(writer, struct_name, data_ptr)
void BLO_read_list(BlendDataReader *reader, struct ListBase *list)
Definition: readfile.c:5654
void * BLO_read_get_new_data_address(BlendDataReader *reader, const void *old_address)
Definition: readfile.c:5600
#define TIP_(msgid)
#define DATA_(msgid)
#define CLOG_ERROR(clg_ref,...)
Definition: CLG_log.h:204
struct Depsgraph Depsgraph
Definition: DEG_depsgraph.h:51
struct ID * DEG_get_original_id(struct ID *id)
struct Object * DEG_get_evaluated_object(const struct Depsgraph *depsgraph, struct Object *object)
#define ID_IS_LINKED(_id)
Definition: DNA_ID.h:426
#define ID_BLEND_PATH_FROM_GLOBAL(_id)
Definition: DNA_ID.h:421
#define ID_BLEND_PATH(_bmain, _id)
Definition: DNA_ID.h:419
#define ID_IS_OVERRIDE_LIBRARY(_id)
Definition: DNA_ID.h:445
#define CD_MASK_ORCO
@ MOD_DPAINT_BAKING
@ FLUID_EFFECTOR_TYPE_GUIDE
@ FLUID_EFFECTOR_TYPE_COLLISION
@ FLUID_FLOW_BEHAVIOR_OUTFLOW
@ FLUID_FLOW_BEHAVIOR_INFLOW
@ FLUID_FLOW_TYPE_LIQUID
@ FLUID_FLOW_TYPE_SMOKE
@ FLUID_DOMAIN_TYPE_GAS
@ FLUID_DOMAIN_TYPE_LIQUID
@ eGpencilModifierType_Armature
@ BASE_SELECTED
eMeshWrapperType
@ ME_WRAPPER_TYPE_MDATA
@ ME_WRAPPER_TYPE_BMESH
@ eModifierFlag_OverrideLibrary_Local
@ eModifierFlag_Active
ModifierMode
@ eModifierMode_Virtual
@ eModifierMode_Render
@ eModifierMode_Editmode
@ eModifierMode_DisableTemporary
@ eModifierMode_Realtime
@ eModifierMode_OnCage
struct ModifierData ModifierData
ModifierType
@ eModifierType_ParticleSystem
@ eModifierType_MeshDeform
@ eModifierType_Fluidsim
@ eModifierType_Subsurf
@ eModifierType_Curve
@ eModifierType_Lattice
@ eModifierType_Cloth
@ eModifierType_Fluid
@ NUM_MODIFIER_TYPES
@ eModifierType_ShapeKey
@ eModifierType_Armature
@ eModifierType_Collision
@ eModifierType_DynamicPaint
@ eModifierType_None
@ eModifierType_Softbody
@ eModifierType_Multires
@ MOD_FLUID_TYPE_EFFEC
@ MOD_FLUID_TYPE_DOMAIN
@ MOD_FLUID_TYPE_FLOW
@ OB_MODE_EDIT
#define OB_FLUIDSIM_OUTFLOW
#define OB_FLUIDSIM_INFLOW
#define OB_FLUIDSIM_PARTICLE
#define OB_FLUIDSIM_ENABLE
#define OB_FLUIDSIM_CONTROL
#define OB_FLUIDSIM_DOMAIN
#define OB_FLUIDSIM_FLUID
#define OB_FLUIDSIM_OBSTACLE
Object is a sort of wrapper for general info.
@ PARSKEL
@ OB_SHAPE_EDIT_MODE
@ OB_LATTICE
@ OB_ARMATURE
@ OB_MESH
@ OB_CURVE
@ OB_GPENCIL
#define PTCACHE_FAKE_SMOKE
#define PTCACHE_DISK_CACHE
@ UI_PANEL_DATA_EXPAND_ROOT
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
void modifier_type_init(ModifierTypeInfo *types[])
Definition: MOD_util.c:287
void BKE_modifier_panel_expand(ModifierData *md)
bool BKE_modifiers_is_modifier_enabled(Object *ob, int modifierType)
Object * BKE_modifiers_is_deformed_by_meshdeform(Object *ob)
bool BKE_modifier_is_non_geometrical(ModifierData *md)
void BKE_modifier_path_init(char *path, int path_maxlen, const char *name)
ModifierData * BKE_modifiers_get_virtual_modifierlist(const Object *ob, VirtualModifierData *virtualModifierData)
static void modifier_ensure_type(FluidModifierData *fluid_modifier_data, int type)
void BKE_modifier_check_uuids_unique_and_report(const Object *object)
const ModifierTypeInfo * BKE_modifier_get_info(ModifierType type)
void BKE_modifiers_clear_errors(Object *ob)
Mesh * BKE_modifier_get_evaluated_mesh_from_evaluated_object(Object *ob_eval, const bool get_cage_mesh)
bool BKE_modifiers_is_cloth_enabled(Object *ob)
int BKE_modifiers_get_cage_index(const Scene *scene, Object *ob, int *r_lastPossibleCageIndex, bool is_virtual)
bool BKE_modifiers_is_correctable_deformed(const struct Scene *scene, Object *ob)
void BKE_modifier_copydata(ModifierData *md, ModifierData *target)
ModifierData * BKE_modifiers_findby_name(const Object *ob, const char *name)
bool BKE_modifiers_uses_multires(Object *ob)
static void modwrap_dependsOnNormals(Mesh *me)
static ModifierTypeInfo * modifier_types[NUM_MODIFIER_TYPES]
struct ModifierData * BKE_modifier_get_evaluated(Depsgraph *depsgraph, Object *object, ModifierData *md)
void BKE_modifier_deform_vertsEM(ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *em, Mesh *me, float(*vertexCos)[3], int numVerts)
void BKE_modifier_blend_read_data(BlendDataReader *reader, ListBase *lb, Object *ob)
void BKE_modifier_set_error(const Object *ob, ModifierData *md, const char *_format,...)
bool BKE_modifier_supports_cage(struct Scene *scene, ModifierData *md)
bool BKE_modifiers_uses_armature(Object *ob, bArmature *arm)
void BKE_modifier_deform_verts(ModifierData *md, const ModifierEvalContext *ctx, Mesh *me, float(*vertexCos)[3], int numVerts)
Object * BKE_modifiers_is_deformed_by_armature(Object *ob)
const char * BKE_modifier_path_relbase_from_global(Object *ob)
bool BKE_modifier_supports_mapping(ModifierData *md)
static void modifier_free_data_id_us_cb(void *UNUSED(userData), Object *UNUSED(ob), ID **idpoin, int cb_flag)
bool BKE_modifier_is_enabled(const struct Scene *scene, ModifierData *md, int required_mode)
struct Mesh * BKE_modifier_modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, struct Mesh *me)
void BKE_modifier_free_temporary_data(ModifierData *md)
void BKE_modifier_blend_write(BlendWriter *writer, ListBase *modbase)
static void modifier_copy_data_id_us_cb(void *UNUSED(userData), Object *UNUSED(ob), ID **idpoin, int cb_flag)
ModifierData * BKE_modifiers_findby_type(const Object *ob, ModifierType type)
bool BKE_modifier_is_same_topology(ModifierData *md)
ModifierData * BKE_modifier_get_original(ModifierData *md)
ModifierData * BKE_modifier_new(int type)
void BKE_modifier_free(ModifierData *md)
bool BKE_modifier_depends_ontime(ModifierData *md)
CDMaskLink * BKE_modifier_calc_data_masks(const struct Scene *scene, Object *ob, ModifierData *md, CustomData_MeshMasks *final_datamask, int required_mode, ModifierData *previewmd, const CustomData_MeshMasks *previewmask)
bool BKE_modifier_is_nonlocal_in_liboverride(const Object *ob, const ModifierData *md)
void BKE_modifiers_test_object(Object *ob)
void BKE_modifier_remove_from_list(Object *ob, ModifierData *md)
bool BKE_modifiers_is_softbody_enabled(Object *ob)
Object * BKE_modifiers_is_deformed_by_lattice(Object *ob)
bool BKE_modifiers_uses_subsurf_facedots(const struct Scene *scene, Object *ob)
Object * BKE_modifiers_is_deformed_by_curve(Object *ob)
bool BKE_modifier_unique_name(ListBase *modifiers, ModifierData *md)
void BKE_modifiers_foreach_tex_link(Object *ob, TexWalkFunc walk, void *userData)
static CLG_LogRef LOG
static VirtualModifierData virtualModifierCommonData
void BKE_modifier_blend_read_lib(BlendLibReader *reader, Object *ob)
bool BKE_modifier_is_correctable_deformed(ModifierData *md)
bool BKE_modifiers_is_particle_enabled(Object *ob)
void BKE_modifier_copydata_ex(ModifierData *md, ModifierData *target, const int flag)
ModifierData * BKE_modifier_get_last_preview(const struct Scene *scene, ModifierData *md, int required_mode)
void BKE_modifier_copydata_generic(const ModifierData *md_src, ModifierData *md_dst, const int UNUSED(flag))
void BKE_modifiers_foreach_ID_link(Object *ob, IDWalkFunc walk, void *userData)
void BKE_modifier_free_ex(ModifierData *md, const int flag)
bool BKE_modifier_is_preview(ModifierData *md)
void BKE_modifier_type_panel_id(ModifierType type, char *r_idname)
static ModifierData * modifier_replace_with_fluid(BlendDataReader *reader, Object *object, ListBase *modifiers, ModifierData *old_modifier_data)
bool BKE_modifier_couldbe_cage(struct Scene *scene, ModifierData *md)
void BKE_modifier_session_uuid_generate(ModifierData *md)
const char * BKE_modifier_path_relbase(Main *bmain, Object *ob)
void BKE_modifier_init(void)
void BM_mesh_normals_update(BMesh *bm)
BMesh Compute Normals.
Definition: bmesh_mesh.c:500
Scene scene
const Depsgraph * depsgraph
struct @203::@204 surface
void * BKE_tempdir_session
__kernel void ccl_constant KernelData ccl_global void ccl_global char ccl_global int ccl_global char ccl_global unsigned int ccl_global float * buffer
format
Definition: logImageCore.h:47
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:41
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:45
struct Mesh * mesh_eval_final
Definition: BKE_editmesh.h:63
struct Mesh * mesh_eval_cage
Definition: BKE_editmesh.h:63
struct BMesh * bm
Definition: BKE_editmesh.h:52
struct ListBase ptcaches
struct ClothSolverResult * solver_result
struct ClothHairData * hairdata
struct Cloth * clothObject
struct PointCache * point_cache
struct ClothSimSettings * sim_parms
struct ClothCollSettings * coll_parms
struct EffectorWeights * effector_weights
struct Object * object
struct DynamicPaintModifierData * pmd
struct ParticleSystem * psys
struct DynamicPaintModifierData * pmd
struct DynamicPaintCanvasSettings * canvas
struct DynamicPaintBrushSettings * brush
const float(* vertexCos)[3]
struct ListBase ptcaches[2]
struct FluidModifierData * fmd
struct GPUTexture * tex_density
struct GPUTexture * tex_velocity_x
struct GPUTexture * tex_color
struct GPUTexture * tex_wt
struct FluidDomainVertexVelocity * mesh_velocities
struct GPUTexture * tex_velocity_y
struct GPUTexture * tex_field
struct MANTA * fluid
struct GPUTexture * tex_velocity_z
struct PointCache * point_cache[2]
struct GPUTexture * tex_shadow
struct ColorBand * coba
struct GPUTexture * tex_coba
struct GPUTexture * tex_flame
struct EffectorWeights * effector_weights
struct GPUTexture * tex_flame_coba
struct FluidModifierData * fmd
struct FluidModifierData * fmd
struct ParticleSystem * psys
struct Mesh * mesh
struct FluidDomainSettings * domain
struct FluidEffectorSettings * effector
struct FluidFlowSettings * flow
struct FluidsimSettings * fss
struct GpencilModifierData * next
Definition: DNA_ID.h:273
struct Library * lib
Definition: DNA_ID.h:277
char name[66]
Definition: DNA_ID.h:283
struct Object * object
void * last
Definition: DNA_listBase.h:47
void * first
Definition: DNA_listBase.h:47
Definition: BKE_main.h:116
struct EditMeshData * edit_data
struct BMEditMesh * edit_mesh
Mesh_Runtime runtime
struct ModifierData * next
struct ModifierData * prev
struct ModifierData * orig_modifier_data
SessionUUID session_uuid
bool(* isDisabled)(const struct Scene *scene, struct ModifierData *md, bool userRenderParams)
Definition: BKE_modifier.h:312
void(* copyData)(const struct ModifierData *md, struct ModifierData *target, const int flag)
Definition: BKE_modifier.h:187
ModifierTypeFlag flags
Definition: BKE_modifier.h:174
void(* deformVertsEM)(struct ModifierData *md, const struct ModifierEvalContext *ctx, struct BMEditMesh *editData, struct Mesh *mesh, float(*vertexCos)[3], int numVerts)
Definition: BKE_modifier.h:215
ModifierTypeType type
Definition: BKE_modifier.h:173
void(* freeData)(struct ModifierData *md)
Definition: BKE_modifier.h:301
struct Mesh *(* modifyMesh)(struct ModifierData *md, const struct ModifierEvalContext *ctx, struct Mesh *mesh)
Definition: BKE_modifier.h:244
void(* blendWrite)(struct BlendWriter *writer, const struct ModifierData *md)
Definition: BKE_modifier.h:388
void(* deformVerts)(struct ModifierData *md, const struct ModifierEvalContext *ctx, struct Mesh *mesh, float(*vertexCos)[3], int numVerts)
Definition: BKE_modifier.h:197
void(* foreachTexLink)(struct ModifierData *md, struct Object *ob, TexWalkFunc walk, void *userData)
Definition: BKE_modifier.h:360
void(* blendRead)(struct BlendDataReader *reader, struct ModifierData *md)
Definition: BKE_modifier.h:396
char structName[32]
Definition: BKE_modifier.h:165
void(* requiredDataMask)(struct Object *ob, struct ModifierData *md, struct CustomData_MeshMasks *r_cddata_masks)
Definition: BKE_modifier.h:289
bool(* dependsOnNormals)(struct ModifierData *md)
Definition: BKE_modifier.h:337
bool(* dependsOnTime)(struct ModifierData *md)
Definition: BKE_modifier.h:327
void(* foreachIDLink)(struct ModifierData *md, struct Object *ob, IDWalkFunc walk, void *userData)
Definition: BKE_modifier.h:347
void(* initData)(struct ModifierData *md)
Definition: BKE_modifier.h:273
void(* deformMatricesEM)(struct ModifierData *md, const struct ModifierEvalContext *ctx, struct BMEditMesh *editData, struct Mesh *mesh, float(*vertexCos)[3], float(*defMats)[3][3], int numVerts)
Definition: BKE_modifier.h:223
struct Mesh * mesh_deform_eval
short partype
short base_flag
ListBase modifiers
Object_Runtime runtime
struct Object * parent
short trackflag
void * data
char shapeflag
ArmatureModifierData amd
Definition: BKE_modifier.h:499
CurveModifierData cmd
Definition: BKE_modifier.h:500
LatticeModifierData lmd
Definition: BKE_modifier.h:501
ShapeKeyModifierData smd
Definition: BKE_modifier.h:502
ccl_device_inline int mod(int x, int m)
Definition: util_math.h:405
#define G(x, y, z)
#define writestruct(wd, filecode, struct_id, nr, adr)
Definition: writefile.c:595