Blender  V3.3
MOD_dynamicpaint.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
7 #include <stddef.h>
8 #include <string.h>
9 
10 #include "BLI_listbase.h"
11 #include "BLI_utildefines.h"
12 
13 #include "BLT_translation.h"
14 
15 #include "DNA_defaults.h"
16 #include "DNA_dynamicpaint_types.h"
17 #include "DNA_mesh_types.h"
18 #include "DNA_object_force_types.h"
19 #include "DNA_object_types.h"
20 #include "DNA_scene_types.h"
21 #include "DNA_screen_types.h"
22 
23 #include "BKE_context.h"
24 #include "BKE_dynamicpaint.h"
25 #include "BKE_layer.h"
26 #include "BKE_lib_query.h"
27 #include "BKE_mesh.h"
28 #include "BKE_modifier.h"
29 #include "BKE_screen.h"
30 
31 #include "UI_interface.h"
32 #include "UI_resources.h"
33 
34 #include "RNA_access.h"
35 #include "RNA_prototypes.h"
36 
37 #include "DEG_depsgraph.h"
38 #include "DEG_depsgraph_build.h"
39 #include "DEG_depsgraph_physics.h"
40 #include "DEG_depsgraph_query.h"
41 
42 #include "MOD_modifiertypes.h"
43 #include "MOD_ui_common.h"
44 
45 static void initData(ModifierData *md)
46 {
48 
50 
52 }
53 
54 static void copyData(const ModifierData *md, ModifierData *target, const int flag)
55 {
56  const DynamicPaintModifierData *pmd = (const DynamicPaintModifierData *)md;
58 
59  dynamicPaint_Modifier_copy(pmd, tpmd, flag);
60 }
61 
62 static void freeRuntimeData(void *runtime_data_v)
63 {
64  if (runtime_data_v == NULL) {
65  return;
66  }
67  DynamicPaintRuntime *runtime_data = (DynamicPaintRuntime *)runtime_data_v;
69 }
70 
71 static void freeData(ModifierData *md)
72 {
75 }
76 
77 static void requiredDataMask(Object *UNUSED(ob),
78  ModifierData *md,
79  CustomData_MeshMasks *r_cddata_masks)
80 {
82 
83  if (pmd->canvas) {
85  for (; surface; surface = surface->next) {
86  /* UV's: #CD_MLOOPUV. */
87  if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ ||
88  surface->init_color_type == MOD_DPAINT_INITIAL_TEXTURE) {
89  r_cddata_masks->lmask |= CD_MASK_MLOOPUV;
90  }
91  /* Vertex Colors: #CD_PROP_BYTE_COLOR. */
92  if (surface->type == MOD_DPAINT_SURFACE_T_PAINT ||
93  surface->init_color_type == MOD_DPAINT_INITIAL_VERTEXCOLOR) {
94  r_cddata_masks->lmask |= CD_MASK_PROP_BYTE_COLOR;
95  }
96  /* Vertex Weights: #CD_MDEFORMVERT. */
97  if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) {
98  r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
99  }
100  }
101  }
102 }
103 
105 {
107 
108  /* Don't apply dynamic paint on ORCO mesh stack. */
109  if (!(ctx->flag & MOD_APPLY_ORCO)) {
111  return dynamicPaint_Modifier_do(pmd, ctx->depsgraph, scene, ctx->object, mesh);
112  }
113  return mesh;
114 }
115 
116 static bool is_brush_cb(Object *UNUSED(ob), ModifierData *md)
117 {
119  return (pmd->brush != NULL && pmd->type == MOD_DYNAMICPAINT_TYPE_BRUSH);
120 }
121 
123 {
125  /* Add relation from canvases to all brush objects. */
126  if (pmd->canvas != NULL && pmd->type == MOD_DYNAMICPAINT_TYPE_CANVAS) {
128  if (surface->effect & MOD_DPAINT_EFFECT_DO_DRIP) {
130  ctx->node, ctx->object, surface->effector_weights, true, 0, "Dynamic Paint Field");
131  }
132 
133  /* Actual code uses custom loop over group/scene
134  * without layer checks in dynamicPaint_doStep. */
136  ctx->object,
137  surface->brush_group,
139  is_brush_cb,
140  "Dynamic Paint Brush");
141  }
142  }
143 }
144 
145 static bool dependsOnTime(struct Scene *UNUSED(scene), ModifierData *UNUSED(md))
146 {
147  return true;
148 }
149 
150 static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
151 {
153 
154  if (pmd->canvas) {
156 
157  for (; surface; surface = surface->next) {
158  walk(userData, ob, (ID **)&surface->brush_group, IDWALK_CB_NOP);
159  walk(userData, ob, (ID **)&surface->init_texture, IDWALK_CB_USER);
160  if (surface->effector_weights) {
161  walk(userData, ob, (ID **)&surface->effector_weights->group, IDWALK_CB_USER);
162  }
163  }
164  }
165 }
166 
168  Object *UNUSED(ob),
169  TexWalkFunc UNUSED(walk),
170  void *UNUSED(userData))
171 {
172  // walk(userData, ob, md, ""); /* re-enable when possible */
173 }
174 
175 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
176 {
177  uiLayout *layout = panel->layout;
178 
180 
181  uiItemL(layout, TIP_("Settings are inside the Physics tab"), ICON_NONE);
182 
183  modifier_panel_end(layout, ptr);
184 }
185 
186 static void panelRegister(ARegionType *region_type)
187 {
189 }
190 
192  /* name */ N_("Dynamic Paint"),
193  /* structName */ "DynamicPaintModifierData",
194  /* structSize */ sizeof(DynamicPaintModifierData),
195  /* srna */ &RNA_DynamicPaintModifier,
200  /* icon */ ICON_MOD_DYNAMICPAINT,
201 
202  /* copyData */ copyData,
203 
204  /* deformVerts */ NULL,
205  /* deformMatrices */ NULL,
206  /* deformVertsEM */ NULL,
207  /* deformMatricesEM */ NULL,
208  /* modifyMesh */ modifyMesh,
209  /* modifyGeometrySet */ NULL,
210 
211  /* initData */ initData,
212  /* requiredDataMask */ requiredDataMask,
213  /* freeData */ freeData,
214  /* isDisabled */ NULL,
215  /* updateDepsgraph */ updateDepsgraph,
216  /* dependsOnTime */ dependsOnTime,
217  /* dependsOnNormals */ NULL,
218  /* foreachIDLink */ foreachIDLink,
219  /* foreachTexLink */ foreachTexLink,
220  /* freeRuntimeData */ freeRuntimeData,
221  /* panelRegister */ panelRegister,
222  /* blendWrite */ NULL,
223  /* blendRead */ NULL,
224 };
void dynamicPaint_Modifier_free(struct DynamicPaintModifierData *pmd)
Definition: dynamicpaint.c:997
void dynamicPaint_Modifier_free_runtime(struct DynamicPaintRuntime *runtime)
Definition: dynamicpaint.c:252
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:73
@ IDWALK_CB_NOP
Definition: BKE_lib_query.h:33
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
Definition: BKE_modifier.h:107
@ eModifierTypeFlag_Single
Definition: BKE_modifier.h:93
@ eModifierTypeFlag_UsesPointCache
Definition: BKE_modifier.h:90
@ eModifierTypeFlag_SupportsMapping
Definition: BKE_modifier.h:68
@ eModifierTypeFlag_UsesPreview
Definition: BKE_modifier.h:99
@ eModifierTypeFlag_AcceptsMesh
Definition: BKE_modifier.h:66
void(* TexWalkFunc)(void *userData, struct Object *ob, struct ModifierData *md, const char *propname)
Definition: BKE_modifier.h:108
@ eModifierTypeType_Constructive
Definition: BKE_modifier.h:47
@ MOD_APPLY_ORCO
Definition: BKE_modifier.h:120
#define BLI_assert(a)
Definition: BLI_assert.h:46
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:336
#define UNUSED(x)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define TIP_(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_PROP_BYTE_COLOR
#define CD_MASK_MDEFORMVERT
#define CD_MASK_MLOOPUV
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:29
@ MOD_DPAINT_INITIAL_VERTEXCOLOR
@ MOD_DPAINT_INITIAL_TEXTURE
@ MOD_DPAINT_SURFACE_T_WEIGHT
@ MOD_DPAINT_SURFACE_T_PAINT
@ MOD_DPAINT_EFFECT_DO_DRIP
@ MOD_DPAINT_SURFACE_F_IMAGESEQ
@ MOD_DYNAMICPAINT_TYPE_BRUSH
@ MOD_DYNAMICPAINT_TYPE_CANVAS
struct DynamicPaintModifierData DynamicPaintModifierData
@ eModifierType_DynamicPaint
Object is a sort of wrapper for general info.
static bool dependsOnTime(struct Scene *UNUSED(scene), ModifierData *UNUSED(md))
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)
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)
Definition: MOD_ui_common.c:91
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
#define C
Definition: RandGen.cpp:25
void uiItemL(uiLayout *layout, const char *name, int icon)
Scene scene
struct @211::@212 surface
struct DynamicPaintCanvasSettings * canvas
struct DynamicPaintBrushSettings * brush
Definition: DNA_ID.h:368
void * first
Definition: DNA_listBase.h:31
struct Depsgraph * depsgraph
Definition: BKE_modifier.h:140
ModifierApplyFlag flag
Definition: BKE_modifier.h:142
struct Object * object
Definition: BKE_modifier.h:141
struct DepsNodeHandle * node
Definition: BKE_modifier.h:134
struct uiLayout * layout
#define N_(msgid)
PointerRNA * ptr
Definition: wm_files.c:3480