Pass copy flag to modifier copyData function

This will allow modifiers to decide whether to copy or share caches between
ModifierData copies.
This commit is contained in:
2018-07-04 12:45:30 +02:00
parent 88b297da99
commit 60b9d413db
19 changed files with 35 additions and 33 deletions

View File

@@ -162,8 +162,10 @@ typedef struct ModifierTypeInfo {
/* Copy instance data for this modifier type. Should copy all user /* Copy instance data for this modifier type. Should copy all user
* level settings to the target modifier. * level settings to the target modifier.
*
* \param flag Copying options (see BKE_library.h's LIB_ID_COPY_... flags for more).
*/ */
void (*copyData)(const struct ModifierData *md, struct ModifierData *target); void (*copyData)(const struct ModifierData *md, struct ModifierData *target, const int flag);
/********************* Deform modifier functions *********************/ /* DEPRECATED */ /********************* Deform modifier functions *********************/ /* DEPRECATED */
@@ -387,7 +389,7 @@ void modifier_free(struct ModifierData *md);
bool modifier_unique_name(struct ListBase *modifiers, struct ModifierData *md); bool modifier_unique_name(struct ListBase *modifiers, struct ModifierData *md);
void modifier_copyData_generic(const struct ModifierData *md, struct ModifierData *target); void modifier_copyData_generic(const struct ModifierData *md, struct ModifierData *target, const int flag);
void modifier_copyData(struct ModifierData *md, struct ModifierData *target); void modifier_copyData(struct ModifierData *md, struct ModifierData *target);
void modifier_copyData_ex(struct ModifierData *md, struct ModifierData *target, const int flag); void modifier_copyData_ex(struct ModifierData *md, struct ModifierData *target, const int flag);
bool modifier_dependsOnTime(struct ModifierData *md); bool modifier_dependsOnTime(struct ModifierData *md);

View File

@@ -293,7 +293,7 @@ void modifiers_foreachTexLink(Object *ob, TexWalkFunc walk, void *userData)
/* callback's can use this /* callback's can use this
* to avoid copying every member. * to avoid copying every member.
*/ */
void modifier_copyData_generic(const ModifierData *md_src, ModifierData *md_dst) void modifier_copyData_generic(const ModifierData *md_src, ModifierData *md_dst, const int UNUSED(flag))
{ {
const ModifierTypeInfo *mti = modifierType_getInfo(md_src->type); const ModifierTypeInfo *mti = modifierType_getInfo(md_src->type);
@@ -326,7 +326,7 @@ void modifier_copyData_ex(ModifierData *md, ModifierData *target, const int flag
target->flag = md->flag; target->flag = md->flag;
if (mti->copyData) { if (mti->copyData) {
mti->copyData(md, target); mti->copyData(md, target, flag);
} }
if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) { if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {

View File

@@ -64,14 +64,14 @@ static void initData(ModifierData *md)
amd->deformflag = ARM_DEF_VGROUP; amd->deformflag = ARM_DEF_VGROUP;
} }
static void copyData(const ModifierData *md, ModifierData *target) static void copyData(const ModifierData *md, ModifierData *target, const int flag)
{ {
#if 0 #if 0
const ArmatureModifierData *amd = (const ArmatureModifierData *) md; const ArmatureModifierData *amd = (const ArmatureModifierData *) md;
#endif #endif
ArmatureModifierData *tamd = (ArmatureModifierData *) target; ArmatureModifierData *tamd = (ArmatureModifierData *) target;
modifier_copyData_generic(md, target); modifier_copyData_generic(md, target, flag);
tamd->prevCos = NULL; tamd->prevCos = NULL;
} }

View File

@@ -155,7 +155,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
return dataMask; return dataMask;
} }
static void copyData(const ModifierData *md, ModifierData *target) static void copyData(const ModifierData *md, ModifierData *target, const int UNUSED(flag))
{ {
const ClothModifierData *clmd = (const ClothModifierData *) md; const ClothModifierData *clmd = (const ClothModifierData *) md;
ClothModifierData *tclmd = (ClothModifierData *) target; ClothModifierData *tclmd = (ClothModifierData *) target;

View File

@@ -80,12 +80,12 @@ static void initData(ModifierData *md)
} }
static void copyData(const ModifierData *md, ModifierData *target) static void copyData(const ModifierData *md, ModifierData *target, const int flag)
{ {
const CorrectiveSmoothModifierData *csmd = (const CorrectiveSmoothModifierData *)md; const CorrectiveSmoothModifierData *csmd = (const CorrectiveSmoothModifierData *)md;
CorrectiveSmoothModifierData *tcsmd = (CorrectiveSmoothModifierData *)target; CorrectiveSmoothModifierData *tcsmd = (CorrectiveSmoothModifierData *)target;
modifier_copyData_generic(md, target); modifier_copyData_generic(md, target, flag);
if (csmd->bind_coords) { if (csmd->bind_coords) {
tcsmd->bind_coords = MEM_dupallocN(csmd->bind_coords); tcsmd->bind_coords = MEM_dupallocN(csmd->bind_coords);

View File

@@ -57,7 +57,7 @@ static void initData(ModifierData *md)
pmd->type = MOD_DYNAMICPAINT_TYPE_CANVAS; pmd->type = MOD_DYNAMICPAINT_TYPE_CANVAS;
} }
static void copyData(const ModifierData *md, ModifierData *target) static void copyData(const ModifierData *md, ModifierData *target, const int UNUSED(flag))
{ {
const DynamicPaintModifierData *pmd = (const DynamicPaintModifierData *)md; const DynamicPaintModifierData *pmd = (const DynamicPaintModifierData *)md;
DynamicPaintModifierData *tpmd = (DynamicPaintModifierData *)target; DynamicPaintModifierData *tpmd = (DynamicPaintModifierData *)target;

View File

@@ -70,14 +70,14 @@ static void freeData(ModifierData *md)
MEM_SAFE_FREE(emd->facepa); MEM_SAFE_FREE(emd->facepa);
} }
static void copyData(const ModifierData *md, ModifierData *target) static void copyData(const ModifierData *md, ModifierData *target, const int flag)
{ {
#if 0 #if 0
const ExplodeModifierData *emd = (const ExplodeModifierData *) md; const ExplodeModifierData *emd = (const ExplodeModifierData *) md;
#endif #endif
ExplodeModifierData *temd = (ExplodeModifierData *) target; ExplodeModifierData *temd = (ExplodeModifierData *) target;
modifier_copyData_generic(md, target); modifier_copyData_generic(md, target, flag);
temd->facepa = NULL; temd->facepa = NULL;
} }

View File

@@ -65,7 +65,7 @@ static void freeData(ModifierData *md)
fluidsim_free(fluidmd); fluidsim_free(fluidmd);
} }
static void copyData(const ModifierData *md, ModifierData *target) static void copyData(const ModifierData *md, ModifierData *target, const int UNUSED(flag))
{ {
const FluidsimModifierData *fluidmd = (const FluidsimModifierData *) md; const FluidsimModifierData *fluidmd = (const FluidsimModifierData *) md;
FluidsimModifierData *tfluidmd = (FluidsimModifierData *) target; FluidsimModifierData *tfluidmd = (FluidsimModifierData *) target;

View File

@@ -63,12 +63,12 @@ static void initData(ModifierData *md)
hmd->flag = 0; hmd->flag = 0;
} }
static void copyData(const ModifierData *md, ModifierData *target) static void copyData(const ModifierData *md, ModifierData *target, const int flag)
{ {
const HookModifierData *hmd = (const HookModifierData *) md; const HookModifierData *hmd = (const HookModifierData *) md;
HookModifierData *thmd = (HookModifierData *) target; HookModifierData *thmd = (HookModifierData *) target;
modifier_copyData_generic(md, target); modifier_copyData_generic(md, target, flag);
thmd->curfalloff = curvemapping_copy(hmd->curfalloff); thmd->curfalloff = curvemapping_copy(hmd->curfalloff);

View File

@@ -704,12 +704,12 @@ static void initData(ModifierData *md)
lmd->flag = 0; lmd->flag = 0;
} }
static void copyData(const ModifierData *md, ModifierData *target) static void copyData(const ModifierData *md, ModifierData *target, const int flag)
{ {
const LaplacianDeformModifierData *lmd = (const LaplacianDeformModifierData *)md; const LaplacianDeformModifierData *lmd = (const LaplacianDeformModifierData *)md;
LaplacianDeformModifierData *tlmd = (LaplacianDeformModifierData *)target; LaplacianDeformModifierData *tlmd = (LaplacianDeformModifierData *)target;
modifier_copyData_generic(md, target); modifier_copyData_generic(md, target, flag);
tlmd->vertexco = MEM_dupallocN(lmd->vertexco); tlmd->vertexco = MEM_dupallocN(lmd->vertexco);
tlmd->cache_system = NULL; tlmd->cache_system = NULL;

View File

@@ -81,12 +81,12 @@ static void freeData(ModifierData *md)
if (mmd->bindcos) MEM_freeN(mmd->bindcos); /* deprecated */ if (mmd->bindcos) MEM_freeN(mmd->bindcos); /* deprecated */
} }
static void copyData(const ModifierData *md, ModifierData *target) static void copyData(const ModifierData *md, ModifierData *target, const int flag)
{ {
const MeshDeformModifierData *mmd = (const MeshDeformModifierData *) md; const MeshDeformModifierData *mmd = (const MeshDeformModifierData *) md;
MeshDeformModifierData *tmmd = (MeshDeformModifierData *) target; MeshDeformModifierData *tmmd = (MeshDeformModifierData *) target;
modifier_copyData_generic(md, target); modifier_copyData_generic(md, target, flag);
if (mmd->bindinfluences) tmmd->bindinfluences = MEM_dupallocN(mmd->bindinfluences); if (mmd->bindinfluences) tmmd->bindinfluences = MEM_dupallocN(mmd->bindinfluences);
if (mmd->bindoffsets) tmmd->bindoffsets = MEM_dupallocN(mmd->bindoffsets); if (mmd->bindoffsets) tmmd->bindoffsets = MEM_dupallocN(mmd->bindoffsets);

View File

@@ -55,14 +55,14 @@ static void initData(ModifierData *md)
mcmd->read_flag = MOD_MESHSEQ_READ_ALL; mcmd->read_flag = MOD_MESHSEQ_READ_ALL;
} }
static void copyData(const ModifierData *md, ModifierData *target) static void copyData(const ModifierData *md, ModifierData *target, const int flag)
{ {
#if 0 #if 0
const MeshSeqCacheModifierData *mcmd = (const MeshSeqCacheModifierData *)md; const MeshSeqCacheModifierData *mcmd = (const MeshSeqCacheModifierData *)md;
#endif #endif
MeshSeqCacheModifierData *tmcmd = (MeshSeqCacheModifierData *)target; MeshSeqCacheModifierData *tmcmd = (MeshSeqCacheModifierData *)target;
modifier_copyData_generic(md, target); modifier_copyData_generic(md, target, flag);
tmcmd->reader = NULL; tmcmd->reader = NULL;
} }

View File

@@ -163,7 +163,7 @@ static void freeData(ModifierData *md)
#endif /* WITH_OCEANSIM */ #endif /* WITH_OCEANSIM */
} }
static void copyData(const ModifierData *md, ModifierData *target) static void copyData(const ModifierData *md, ModifierData *target, const int UNUSED(flag))
{ {
#ifdef WITH_OCEANSIM #ifdef WITH_OCEANSIM
#if 0 #if 0

View File

@@ -79,14 +79,14 @@ static void freeData(ModifierData *md)
psmd->psys->flag |= PSYS_DELETE; psmd->psys->flag |= PSYS_DELETE;
} }
static void copyData(const ModifierData *md, ModifierData *target) static void copyData(const ModifierData *md, ModifierData *target, const int flag)
{ {
#if 0 #if 0
const ParticleSystemModifierData *psmd = (const ParticleSystemModifierData *) md; const ParticleSystemModifierData *psmd = (const ParticleSystemModifierData *) md;
#endif #endif
ParticleSystemModifierData *tpsmd = (ParticleSystemModifierData *) target; ParticleSystemModifierData *tpsmd = (ParticleSystemModifierData *) target;
modifier_copyData_generic(md, target); modifier_copyData_generic(md, target, flag);
tpsmd->mesh_final = NULL; tpsmd->mesh_final = NULL;
tpsmd->mesh_original = NULL; tpsmd->mesh_original = NULL;

View File

@@ -71,7 +71,7 @@ static void initData(ModifierData *md)
smd->time = -1; smd->time = -1;
} }
static void copyData(const ModifierData *md, ModifierData *target) static void copyData(const ModifierData *md, ModifierData *target, const int UNUSED(flag))
{ {
const SmokeModifierData *smd = (const SmokeModifierData *)md; const SmokeModifierData *smd = (const SmokeModifierData *)md;
SmokeModifierData *tsmd = (SmokeModifierData *)target; SmokeModifierData *tsmd = (SmokeModifierData *)target;

View File

@@ -65,14 +65,14 @@ static void initData(ModifierData *md)
smd->flags |= eSubsurfModifierFlag_SubsurfUv; smd->flags |= eSubsurfModifierFlag_SubsurfUv;
} }
static void copyData(const ModifierData *md, ModifierData *target) static void copyData(const ModifierData *md, ModifierData *target, const int flag)
{ {
#if 0 #if 0
const SubsurfModifierData *smd = (const SubsurfModifierData *) md; const SubsurfModifierData *smd = (const SubsurfModifierData *) md;
#endif #endif
SubsurfModifierData *tsmd = (SubsurfModifierData *) target; SubsurfModifierData *tsmd = (SubsurfModifierData *) target;
modifier_copyData_generic(md, target); modifier_copyData_generic(md, target, flag);
tsmd->emCache = tsmd->mCache = NULL; tsmd->emCache = tsmd->mCache = NULL;
} }

View File

@@ -136,12 +136,12 @@ static void freeData(ModifierData *md)
} }
} }
static void copyData(const ModifierData *md, ModifierData *target) static void copyData(const ModifierData *md, ModifierData *target, const int flag)
{ {
const SurfaceDeformModifierData *smd = (const SurfaceDeformModifierData *)md; const SurfaceDeformModifierData *smd = (const SurfaceDeformModifierData *)md;
SurfaceDeformModifierData *tsmd = (SurfaceDeformModifierData *)target; SurfaceDeformModifierData *tsmd = (SurfaceDeformModifierData *)target;
modifier_copyData_generic(md, target); modifier_copyData_generic(md, target, flag);
if (smd->verts) { if (smd->verts) {
tsmd->verts = MEM_dupallocN(smd->verts); tsmd->verts = MEM_dupallocN(smd->verts);

View File

@@ -65,12 +65,12 @@ static void initData(ModifierData *md)
wmd->flag = 0; wmd->flag = 0;
} }
static void copyData(const ModifierData *md, ModifierData *target) static void copyData(const ModifierData *md, ModifierData *target, const int flag)
{ {
const WarpModifierData *wmd = (const WarpModifierData *) md; const WarpModifierData *wmd = (const WarpModifierData *) md;
WarpModifierData *twmd = (WarpModifierData *) target; WarpModifierData *twmd = (WarpModifierData *) target;
modifier_copyData_generic(md, target); modifier_copyData_generic(md, target, flag);
twmd->curfalloff = curvemapping_copy(wmd->curfalloff); twmd->curfalloff = curvemapping_copy(wmd->curfalloff);
} }

View File

@@ -81,12 +81,12 @@ static void freeData(ModifierData *md)
curvemapping_free(wmd->cmap_curve); curvemapping_free(wmd->cmap_curve);
} }
static void copyData(const ModifierData *md, ModifierData *target) static void copyData(const ModifierData *md, ModifierData *target, const int flag)
{ {
const WeightVGEditModifierData *wmd = (const WeightVGEditModifierData *) md; const WeightVGEditModifierData *wmd = (const WeightVGEditModifierData *) md;
WeightVGEditModifierData *twmd = (WeightVGEditModifierData *) target; WeightVGEditModifierData *twmd = (WeightVGEditModifierData *) target;
modifier_copyData_generic(md, target); modifier_copyData_generic(md, target, flag);
twmd->cmap_curve = curvemapping_copy(wmd->cmap_curve); twmd->cmap_curve = curvemapping_copy(wmd->cmap_curve);
} }