diff options
Diffstat (limited to 'source/blender/modifiers/intern/MOD_dynamicpaint.c')
-rw-r--r-- | source/blender/modifiers/intern/MOD_dynamicpaint.c | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/source/blender/modifiers/intern/MOD_dynamicpaint.c b/source/blender/modifiers/intern/MOD_dynamicpaint.c new file mode 100644 index 00000000000..e6272834ef0 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_dynamicpaint.c @@ -0,0 +1,178 @@ +/* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* Contributor(s): Miika Hämäläinen +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include <stddef.h> + +#include "DNA_dynamicpaint_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_object_types.h" +#include "DNA_scene_types.h" + +#include "MEM_guardedalloc.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_dynamicpaint.h" +#include "BKE_modifier.h" + +#include "depsgraph_private.h" + +#include "MOD_util.h" + + +static void initData(ModifierData *md) +{ + DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md; + + pmd->canvas = NULL; + pmd->brush = NULL; + pmd->type = MOD_DYNAMICPAINT_TYPE_CANVAS; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + DynamicPaintModifierData *pmd = (DynamicPaintModifierData*)md; + DynamicPaintModifierData *tpmd = (DynamicPaintModifierData*)target; + + dynamicPaint_Modifier_copy(pmd, tpmd); +} + +static void freeData(ModifierData *md) +{ + DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md; + dynamicPaint_Modifier_free(pmd); +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + DynamicPaintModifierData *pmd = (DynamicPaintModifierData*)md; + CustomDataMask dataMask = 0; + + if (pmd->canvas) { + DynamicPaintSurface *surface = pmd->canvas->surfaces.first; + for(; surface; surface=surface->next) { + /* tface */ + if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ || + surface->init_color_type == MOD_DPAINT_INITIAL_TEXTURE) { + dataMask |= (1 << CD_MTFACE); + } + /* mcol */ + if (surface->type == MOD_DPAINT_SURFACE_T_PAINT || + surface->init_color_type == MOD_DPAINT_INITIAL_VERTEXCOLOR) { + dataMask |= (1 << CD_MCOL); + } + /* CD_MDEFORMVERT */ + if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) { + dataMask |= (1 << CD_MDEFORMVERT); + } + } + } + + if (pmd->brush) { + if (pmd->brush->flags & MOD_DPAINT_USE_MATERIAL) { + dataMask |= (1 << CD_MTFACE); + } + } + return dataMask; +} + +static DerivedMesh *applyModifier(ModifierData *md, Object *ob, + DerivedMesh *dm, + int useRenderParams, + int isFinalCalc) +{ + DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md; + + return dynamicPaint_Modifier_do(pmd, md->scene, ob, dm); +} + +static void updateDepgraph(ModifierData *md, DagForest *forest, + struct Scene *scene, + Object *ob, + DagNode *obNode) +{ + DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md; + + /* add relation from canvases to all brush objects */ + if(pmd && pmd->canvas) + { + Base *base = scene->base.first; + + for(; base; base = base->next) { + DynamicPaintModifierData *pmd2 = (DynamicPaintModifierData *)modifiers_findByType(base->object, eModifierType_DynamicPaint); + + if(pmd2 && pmd2->brush && ob!=base->object) + { + DagNode *brushNode = dag_get_node(forest, base->object); + dag_add_relation(forest, brushNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Dynamic Paint Brush"); + } + } + } +} + +static int dependsOnTime(ModifierData *md) +{ + return 1; +} + +static void foreachIDLink(ModifierData *md, Object *ob, + IDWalkFunc walk, void *userData) +{ + DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md; + + if(pmd->canvas) { + DynamicPaintSurface *surface = pmd->canvas->surfaces.first; + + for(; surface; surface=surface->next) { + walk(userData, ob, (ID **)&surface->brush_group); + walk(userData, ob, (ID **)&surface->init_texture); + } + } + if (pmd->brush) { + walk(userData, ob, (ID **)&pmd->brush->mat); + } +} + +static void foreachTexLink(ModifierData *md, Object *ob, + TexWalkFunc walk, void *userData) +{ + walk(userData, ob, md, ""); /* property name isn't used */ +} + +ModifierTypeInfo modifierType_DynamicPaint = { + /* name */ "Dynamic Paint", + /* structName */ "DynamicPaintModifierData", + /* structSize */ sizeof(DynamicPaintModifierData), + /* type */ eModifierTypeType_Constructive, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_UsesPointCache + | eModifierTypeFlag_Single, + + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformMatrices */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ freeData, + /* isDisabled */ 0, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ dependsOnTime, + /* dependsOnNormals */ 0, + /* foreachObjectLink */ 0, + /* foreachIDLink */ foreachIDLink, + /* foreachTexLink */ foreachTexLink, +}; |