Blender  V2.93
MOD_dynamicpaint.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 
21 #include <stddef.h>
22 #include <string.h>
23 
24 #include "BLI_listbase.h"
25 #include "BLI_utildefines.h"
26 
27 #include "BLT_translation.h"
28 
29 #include "DNA_defaults.h"
30 #include "DNA_dynamicpaint_types.h"
31 #include "DNA_mesh_types.h"
32 #include "DNA_object_force_types.h"
33 #include "DNA_object_types.h"
34 #include "DNA_scene_types.h"
35 #include "DNA_screen_types.h"
36 
37 #include "BKE_context.h"
38 #include "BKE_dynamicpaint.h"
39 #include "BKE_layer.h"
40 #include "BKE_lib_query.h"
41 #include "BKE_mesh.h"
42 #include "BKE_modifier.h"
43 #include "BKE_screen.h"
44 
45 #include "UI_interface.h"
46 #include "UI_resources.h"
47 
48 #include "RNA_access.h"
49 
50 #include "DEG_depsgraph.h"
51 #include "DEG_depsgraph_build.h"
52 #include "DEG_depsgraph_physics.h"
53 #include "DEG_depsgraph_query.h"
54 
55 #include "MOD_modifiertypes.h"
56 #include "MOD_ui_common.h"
57 
58 static void initData(ModifierData *md)
59 {
61 
63 
65 }
66 
67 static void copyData(const ModifierData *md, ModifierData *target, const int flag)
68 {
69  const DynamicPaintModifierData *pmd = (const DynamicPaintModifierData *)md;
71 
72  dynamicPaint_Modifier_copy(pmd, tpmd, flag);
73 }
74 
75 static void freeRuntimeData(void *runtime_data_v)
76 {
77  if (runtime_data_v == NULL) {
78  return;
79  }
80  DynamicPaintRuntime *runtime_data = (DynamicPaintRuntime *)runtime_data_v;
82 }
83 
84 static void freeData(ModifierData *md)
85 {
88 }
89 
90 static void requiredDataMask(Object *UNUSED(ob),
91  ModifierData *md,
92  CustomData_MeshMasks *r_cddata_masks)
93 {
95 
96  if (pmd->canvas) {
98  for (; surface; surface = surface->next) {
99  /* tface */
100  if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ ||
101  surface->init_color_type == MOD_DPAINT_INITIAL_TEXTURE) {
102  r_cddata_masks->lmask |= CD_MASK_MLOOPUV;
103  }
104  /* mcol */
105  if (surface->type == MOD_DPAINT_SURFACE_T_PAINT ||
106  surface->init_color_type == MOD_DPAINT_INITIAL_VERTEXCOLOR) {
107  r_cddata_masks->lmask |= CD_MASK_MLOOPCOL;
108  }
109  /* CD_MDEFORMVERT */
110  if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) {
111  r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
112  }
113  }
114  }
115 }
116 
118 {
120 
121  /* Don't apply dynamic paint on ORCO mesh stack. */
122  if (!(ctx->flag & MOD_APPLY_ORCO)) {
124  return dynamicPaint_Modifier_do(pmd, ctx->depsgraph, scene, ctx->object, mesh);
125  }
126  return mesh;
127 }
128 
129 static bool is_brush_cb(Object *UNUSED(ob), ModifierData *md)
130 {
132  return (pmd->brush != NULL && pmd->type == MOD_DYNAMICPAINT_TYPE_BRUSH);
133 }
134 
136 {
138  /* Add relation from canvases to all brush objects. */
139  if (pmd->canvas != NULL && pmd->type == MOD_DYNAMICPAINT_TYPE_CANVAS) {
141  if (surface->effect & MOD_DPAINT_EFFECT_DO_DRIP) {
143  ctx->node, ctx->object, surface->effector_weights, true, 0, "Dynamic Paint Field");
144  }
145 
146  /* Actual code uses custom loop over group/scene
147  * without layer checks in dynamicPaint_doStep. */
149  ctx->object,
150  surface->brush_group,
152  is_brush_cb,
153  "Dynamic Paint Brush");
154  }
155  }
156 }
157 
159 {
160  return true;
161 }
162 
163 static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
164 {
166 
167  if (pmd->canvas) {
169 
170  for (; surface; surface = surface->next) {
171  walk(userData, ob, (ID **)&surface->brush_group, IDWALK_CB_NOP);
172  walk(userData, ob, (ID **)&surface->init_texture, IDWALK_CB_USER);
173  if (surface->effector_weights) {
174  walk(userData, ob, (ID **)&surface->effector_weights->group, IDWALK_CB_NOP);
175  }
176  }
177  }
178 }
179 
181  Object *UNUSED(ob),
182  TexWalkFunc UNUSED(walk),
183  void *UNUSED(userData))
184 {
185  // walk(userData, ob, md, ""); /* re-enable when possible */
186 }
187 
188 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
189 {
190  uiLayout *layout = panel->layout;
191 
193 
194  uiItemL(layout, IFACE_("Settings are inside the Physics tab"), ICON_NONE);
195 
196  modifier_panel_end(layout, ptr);
197 }
198 
199 static void panelRegister(ARegionType *region_type)
200 {
202 }
203 
205  /* name */ "Dynamic Paint",
206  /* structName */ "DynamicPaintModifierData",
207  /* structSize */ sizeof(DynamicPaintModifierData),
208  /* srna */ &RNA_DynamicPaintModifier,
213  /* icon */ ICON_MOD_DYNAMICPAINT,
214 
215  /* copyData */ copyData,
216 
217  /* deformVerts */ NULL,
218  /* deformMatrices */ NULL,
219  /* deformVertsEM */ NULL,
220  /* deformMatricesEM */ NULL,
221  /* modifyMesh */ modifyMesh,
222  /* modifyHair */ NULL,
223  /* modifyGeometrySet */ NULL,
224  /* modifyVolume */ NULL,
225 
226  /* initData */ initData,
227  /* requiredDataMask */ requiredDataMask,
228  /* freeData */ freeData,
229  /* isDisabled */ NULL,
230  /* updateDepsgraph */ updateDepsgraph,
231  /* dependsOnTime */ dependsOnTime,
232  /* dependsOnNormals */ NULL,
233  /* foreachIDLink */ foreachIDLink,
234  /* foreachTexLink */ foreachTexLink,
235  /* freeRuntimeData */ freeRuntimeData,
236  /* panelRegister */ panelRegister,
237  /* blendWrite */ NULL,
238  /* blendRead */ NULL,
239 };
void dynamicPaint_Modifier_free(struct DynamicPaintModifierData *pmd)
void dynamicPaint_Modifier_free_runtime(struct DynamicPaintRuntime *runtime)
Definition: dynamicpaint.c:265
struct Mesh * dynamicPaint_Modifier_do(struct DynamicPaintModifierData *pmd, struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct Mesh *me)
void dynamicPaint_Modifier_copy(const struct DynamicPaintModifierData *pmd, struct DynamicPaintModifierData *tpmd, int flag)
@ IDWALK_CB_USER
Definition: BKE_lib_query.h:87
@ IDWALK_CB_NOP
Definition: BKE_lib_query.h:47
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
Definition: BKE_modifier.h:120
@ eModifierTypeFlag_Single
Definition: BKE_modifier.h:107
@ eModifierTypeFlag_UsesPointCache
Definition: BKE_modifier.h:104
@ eModifierTypeFlag_SupportsMapping
Definition: BKE_modifier.h:82
@ eModifierTypeFlag_UsesPreview
Definition: BKE_modifier.h:113
@ eModifierTypeFlag_AcceptsMesh
Definition: BKE_modifier.h:80
void(* TexWalkFunc)(void *userData, struct Object *ob, struct ModifierData *md, const char *propname)
Definition: BKE_modifier.h:121
@ eModifierTypeType_Constructive
Definition: BKE_modifier.h:61
@ MOD_APPLY_ORCO
Definition: BKE_modifier.h:133
#define BLI_assert(a)
Definition: BLI_assert.h:58
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:172
#define UNUSED(x)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define IFACE_(msgid)
void DEG_add_collision_relations(struct DepsNodeHandle *handle, struct Object *object, struct Collection *collection, unsigned int modifier_type, DEG_CollobjFilterFunction filter_function, const char *name)
void DEG_add_forcefield_relations(struct DepsNodeHandle *handle, struct Object *object, struct EffectorWeights *eff, bool add_absorption, int skip_forcefield, const char *name)
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
#define CD_MASK_MDEFORMVERT
#define CD_MASK_MLOOPCOL
#define CD_MASK_MLOOPUV
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:44
@ MOD_DPAINT_INITIAL_VERTEXCOLOR
@ MOD_DPAINT_INITIAL_TEXTURE
@ MOD_DPAINT_EFFECT_DO_DRIP
@ MOD_DPAINT_SURFACE_T_WEIGHT
@ MOD_DPAINT_SURFACE_T_PAINT
@ MOD_DPAINT_SURFACE_F_IMAGESEQ
struct DynamicPaintModifierData DynamicPaintModifierData
@ eModifierType_DynamicPaint
@ MOD_DYNAMICPAINT_TYPE_BRUSH
@ MOD_DYNAMICPAINT_TYPE_CANVAS
Object is a sort of wrapper for general info.
static void copyData(const ModifierData *md, ModifierData *target, const int flag)
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
static void freeRuntimeData(void *runtime_data_v)
static bool is_brush_cb(Object *UNUSED(ob), ModifierData *md)
static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
static bool dependsOnTime(ModifierData *UNUSED(md))
ModifierTypeInfo modifierType_DynamicPaint
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
static void initData(ModifierData *md)
static void panelRegister(ARegionType *region_type)
static void freeData(ModifierData *md)
static void foreachTexLink(ModifierData *UNUSED(md), Object *UNUSED(ob), TexWalkFunc UNUSED(walk), void *UNUSED(userData))
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
StructRNA RNA_DynamicPaintModifier
#define C
Definition: RandGen.cpp:39
void uiItemL(uiLayout *layout, const char *name, int icon)
Scene scene
struct @203::@204 surface
struct DynamicPaintCanvasSettings * canvas
struct DynamicPaintBrushSettings * brush
Definition: DNA_ID.h:273
void * first
Definition: DNA_listBase.h:47
struct Depsgraph * depsgraph
Definition: BKE_modifier.h:153
ModifierApplyFlag flag
Definition: BKE_modifier.h:155
struct Object * object
Definition: BKE_modifier.h:154
struct DepsNodeHandle * node
Definition: BKE_modifier.h:147
struct uiLayout * layout
PointerRNA * ptr
Definition: wm_files.c:3157