Fix T57938: Dynamic paint baking issues
Quite usual fix for the caching systems.
This commit is contained in:
parent
640eb00670
commit
698f1e3d94
@ -69,13 +69,16 @@ struct Mesh *dynamicPaint_Modifier_do(
|
||||
struct DynamicPaintModifierData *pmd, struct Depsgraph *depsgraph, struct Scene *scene,
|
||||
struct Object *ob, struct Mesh *me);
|
||||
void dynamicPaint_Modifier_free(struct DynamicPaintModifierData *pmd);
|
||||
void dynamicPaint_Modifier_copy(const struct DynamicPaintModifierData *pmd, struct DynamicPaintModifierData *tsmd);
|
||||
void dynamicPaint_Modifier_copy(const struct DynamicPaintModifierData *pmd,
|
||||
struct DynamicPaintModifierData *tsmd,
|
||||
int flag);
|
||||
|
||||
bool dynamicPaint_createType(struct DynamicPaintModifierData *pmd, int type, struct Scene *scene);
|
||||
struct DynamicPaintSurface *dynamicPaint_createNewSurface(struct DynamicPaintCanvasSettings *canvas, struct Scene *scene);
|
||||
void dynamicPaint_clearSurface(const struct Scene *scene, struct DynamicPaintSurface *surface);
|
||||
bool dynamicPaint_resetSurface(const struct Scene *scene, struct DynamicPaintSurface *surface);
|
||||
void dynamicPaint_freeSurface(struct DynamicPaintSurface *surface);
|
||||
void dynamicPaint_freeSurface(const struct DynamicPaintModifierData *pmd,
|
||||
struct DynamicPaintSurface *surface);
|
||||
void dynamicPaint_freeCanvas(struct DynamicPaintModifierData *pmd);
|
||||
void dynamicPaint_freeBrush(struct DynamicPaintModifierData *pmd);
|
||||
void dynamicPaint_freeSurfaceData(struct DynamicPaintSurface *surface);
|
||||
|
@ -915,10 +915,13 @@ void dynamicPaint_freeSurfaceData(DynamicPaintSurface *surface)
|
||||
surface->data = NULL;
|
||||
}
|
||||
|
||||
void dynamicPaint_freeSurface(DynamicPaintSurface *surface)
|
||||
void dynamicPaint_freeSurface(const DynamicPaintModifierData *pmd,
|
||||
DynamicPaintSurface *surface)
|
||||
{
|
||||
/* point cache */
|
||||
BKE_ptcache_free_list(&(surface->ptcaches));
|
||||
if ((pmd->modifier.flag & eModifierFlag_SharedCaches) == 0) {
|
||||
BKE_ptcache_free_list(&(surface->ptcaches));
|
||||
}
|
||||
surface->pointcache = NULL;
|
||||
|
||||
if (surface->effector_weights)
|
||||
@ -940,7 +943,7 @@ void dynamicPaint_freeCanvas(DynamicPaintModifierData *pmd)
|
||||
|
||||
while (surface) {
|
||||
next_surface = surface->next;
|
||||
dynamicPaint_freeSurface(surface);
|
||||
dynamicPaint_freeSurface(pmd, surface);
|
||||
surface = next_surface;
|
||||
}
|
||||
|
||||
@ -1139,7 +1142,9 @@ bool dynamicPaint_createType(struct DynamicPaintModifierData *pmd, int type, str
|
||||
return true;
|
||||
}
|
||||
|
||||
void dynamicPaint_Modifier_copy(const struct DynamicPaintModifierData *pmd, struct DynamicPaintModifierData *tpmd)
|
||||
void dynamicPaint_Modifier_copy(const struct DynamicPaintModifierData *pmd,
|
||||
struct DynamicPaintModifierData *tpmd,
|
||||
int flag)
|
||||
{
|
||||
/* Init modifier */
|
||||
tpmd->type = pmd->type;
|
||||
@ -1154,11 +1159,19 @@ void dynamicPaint_Modifier_copy(const struct DynamicPaintModifierData *pmd, stru
|
||||
tpmd->canvas->pmd = tpmd;
|
||||
/* free default surface */
|
||||
if (tpmd->canvas->surfaces.first)
|
||||
dynamicPaint_freeSurface(tpmd->canvas->surfaces.first);
|
||||
dynamicPaint_freeSurface(tpmd, tpmd->canvas->surfaces.first);
|
||||
|
||||
/* copy existing surfaces */
|
||||
for (surface = pmd->canvas->surfaces.first; surface; surface = surface->next) {
|
||||
DynamicPaintSurface *t_surface = dynamicPaint_createNewSurface(tpmd->canvas, NULL);
|
||||
if (flag & LIB_ID_CREATE_NO_MAIN) {
|
||||
/* TODO(sergey): Consider passing some tips to the surface
|
||||
* creation to avoid this allocate-and-free cache behavior. */
|
||||
BKE_ptcache_free_list(&t_surface->ptcaches);
|
||||
tpmd->modifier.flag |= eModifierFlag_SharedCaches;
|
||||
t_surface->ptcaches = surface->ptcaches;
|
||||
t_surface->pointcache = surface->pointcache;
|
||||
}
|
||||
|
||||
/* surface settings */
|
||||
t_surface->brush_group = surface->brush_group;
|
||||
|
@ -130,7 +130,7 @@ static int surface_slot_remove_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
for (; surface; surface = surface->next) {
|
||||
if (id == canvas->active_sur) {
|
||||
canvas->active_sur -= 1;
|
||||
dynamicPaint_freeSurface(surface);
|
||||
dynamicPaint_freeSurface(pmd, surface);
|
||||
break;
|
||||
}
|
||||
id++;
|
||||
|
@ -58,12 +58,12 @@ static void initData(ModifierData *md)
|
||||
pmd->type = MOD_DYNAMICPAINT_TYPE_CANVAS;
|
||||
}
|
||||
|
||||
static void copyData(const ModifierData *md, ModifierData *target, const int UNUSED(flag))
|
||||
static void copyData(const ModifierData *md, ModifierData *target, const int flag)
|
||||
{
|
||||
const DynamicPaintModifierData *pmd = (const DynamicPaintModifierData *)md;
|
||||
DynamicPaintModifierData *tpmd = (DynamicPaintModifierData *)target;
|
||||
|
||||
dynamicPaint_Modifier_copy(pmd, tpmd);
|
||||
dynamicPaint_Modifier_copy(pmd, tpmd, flag);
|
||||
}
|
||||
|
||||
static void freeData(ModifierData *md)
|
||||
|
Loading…
Reference in New Issue
Block a user