Blender V4.3
MOD_dynamicpaint.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include <cstddef>
10#include <cstring>
11
12#include "BLI_listbase.h"
13#include "BLI_utildefines.h"
14
15#include "BLT_translation.hh"
16
17#include "DNA_defaults.h"
20#include "DNA_object_types.h"
21#include "DNA_screen_types.h"
22
23#include "BKE_dynamicpaint.h"
24#include "BKE_lib_query.hh"
25#include "BKE_modifier.hh"
26
27#include "UI_interface.hh"
28#include "UI_resources.hh"
29
30#include "RNA_prototypes.hh"
31
32#include "DEG_depsgraph.hh"
36
37#include "MOD_ui_common.hh"
38
47
48static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
49{
52
54}
55
56static void free_runtime_data(void *runtime_data_v)
57{
58 if (runtime_data_v == nullptr) {
59 return;
60 }
61 DynamicPaintRuntime *runtime_data = (DynamicPaintRuntime *)runtime_data_v;
63}
64
70
71static void required_data_mask(ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
72{
74
75 if (pmd->canvas) {
76 DynamicPaintSurface *surface = static_cast<DynamicPaintSurface *>(pmd->canvas->surfaces.first);
77 for (; surface; surface = surface->next) {
78 /* UVs: #CD_PROP_FLOAT2. */
79 if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ ||
80 surface->init_color_type == MOD_DPAINT_INITIAL_TEXTURE)
81 {
82 r_cddata_masks->lmask |= CD_MASK_PROP_FLOAT2;
83 }
84 /* Vertex Colors: #CD_PROP_BYTE_COLOR. */
85 if (surface->type == MOD_DPAINT_SURFACE_T_PAINT ||
86 surface->init_color_type == MOD_DPAINT_INITIAL_VERTEXCOLOR)
87 {
88 r_cddata_masks->lmask |= CD_MASK_PROP_BYTE_COLOR;
89 }
90 /* Vertex Weights: #CD_MDEFORMVERT. */
91 if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) {
92 r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
93 }
94 }
95 }
96}
97
98static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
99{
101
102 /* Don't apply dynamic paint on ORCO mesh stack. */
103 if (!(ctx->flag & MOD_APPLY_ORCO)) {
105 return dynamicPaint_Modifier_do(pmd, ctx->depsgraph, scene, ctx->object, mesh);
106 }
107 return mesh;
108}
109
110static bool is_brush_cb(Object * /*ob*/, ModifierData *md)
111{
113 return (pmd->brush != nullptr && pmd->type == MOD_DYNAMICPAINT_TYPE_BRUSH);
114}
115
117{
119 /* Add relation from canvases to all brush objects. */
120 if (pmd->canvas != nullptr && pmd->type == MOD_DYNAMICPAINT_TYPE_CANVAS) {
122 if (surface->effect & MOD_DPAINT_EFFECT_DO_DRIP) {
124 ctx->node, ctx->object, surface->effector_weights, true, 0, "Dynamic Paint Field");
125 }
126
127 /* Actual code uses custom loop over group/scene
128 * without layer checks in dynamicPaint_doStep. */
130 ctx->object,
131 surface->brush_group,
134 "Dynamic Paint Brush");
135 }
136 }
137}
138
139static bool depends_on_time(Scene * /*scene*/, ModifierData * /*md*/)
140{
141 return true;
142}
143
144static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
145{
147
148 if (pmd->canvas) {
149 DynamicPaintSurface *surface = static_cast<DynamicPaintSurface *>(pmd->canvas->surfaces.first);
150
151 for (; surface; surface = surface->next) {
152 walk(user_data, ob, (ID **)&surface->brush_group, IDWALK_CB_NOP);
153 walk(user_data, ob, (ID **)&surface->init_texture, IDWALK_CB_USER);
154 if (surface->effector_weights) {
155 walk(user_data, ob, (ID **)&surface->effector_weights->group, IDWALK_CB_USER);
156 }
157 }
158 }
159}
160
161static void foreach_tex_link(ModifierData * /*md*/,
162 Object * /*ob*/,
163 TexWalkFunc /*walk*/,
164 void * /*user_data*/)
165{
166 // walk(user_data, ob, md, ""); /* re-enable when possible */
167}
168
169static void panel_draw(const bContext * /*C*/, Panel *panel)
170{
171 uiLayout *layout = panel->layout;
172
174
175 uiItemL(layout, RPT_("Settings are inside the Physics tab"), ICON_NONE);
176
177 modifier_panel_end(layout, ptr);
178}
179
180static void panel_register(ARegionType *region_type)
181{
183}
184
186 /*idname*/ "Dynamic Paint",
187 /*name*/ N_("Dynamic Paint"),
188 /*struct_name*/ "DynamicPaintModifierData",
189 /*struct_size*/ sizeof(DynamicPaintModifierData),
190 /*srna*/ &RNA_DynamicPaintModifier,
194 /*icon*/ ICON_MOD_DYNAMICPAINT,
195
196 /*copy_data*/ copy_data,
197
198 /*deform_verts*/ nullptr,
199 /*deform_matrices*/ nullptr,
200 /*deform_verts_EM*/ nullptr,
201 /*deform_matrices_EM*/ nullptr,
202 /*modify_mesh*/ modify_mesh,
203 /*modify_geometry_set*/ nullptr,
204
205 /*init_data*/ init_data,
206 /*required_data_mask*/ required_data_mask,
207 /*free_data*/ free_data,
208 /*is_disabled*/ nullptr,
209 /*update_depsgraph*/ update_depsgraph,
210 /*depends_on_time*/ depends_on_time,
211 /*depends_on_normals*/ nullptr,
212 /*foreach_ID_link*/ foreach_ID_link,
213 /*foreach_tex_link*/ foreach_tex_link,
214 /*free_runtime_data*/ free_runtime_data,
215 /*panel_register*/ panel_register,
216 /*blend_write*/ nullptr,
217 /*blend_read*/ nullptr,
218 /*foreach_cache*/ nullptr,
219};
struct Mesh * dynamicPaint_Modifier_do(struct DynamicPaintModifierData *pmd, struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct Mesh *mesh)
void dynamicPaint_Modifier_free(struct DynamicPaintModifierData *pmd)
void dynamicPaint_Modifier_free_runtime(struct DynamicPaintRuntime *runtime)
void dynamicPaint_Modifier_copy(const struct DynamicPaintModifierData *pmd, struct DynamicPaintModifierData *tpmd, int flag)
@ IDWALK_CB_USER
@ IDWALK_CB_NOP
void(*)(void *user_data, Object *ob, ModifierData *md, const PointerRNA *ptr, PropertyRNA *texture_prop) TexWalkFunc
@ eModifierTypeFlag_Single
@ eModifierTypeFlag_UsesPointCache
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_AcceptsMesh
void(*)(void *user_data, Object *ob, ID **idpoin, int cb_flag) IDWalkFunc
@ MOD_APPLY_ORCO
#define BLI_assert(a)
Definition BLI_assert.h:50
#define LISTBASE_FOREACH(type, var, list)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define RPT_(msgid)
void DEG_add_collision_relations(DepsNodeHandle *handle, Object *object, Collection *collection, unsigned int modifier_type, DEG_CollobjFilterFunction filter_function, const char *name)
void DEG_add_forcefield_relations(DepsNodeHandle *handle, Object *object, EffectorWeights *eff, bool add_absorption, int skip_forcefield, const char *name)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
#define CD_MASK_PROP_BYTE_COLOR
#define CD_MASK_MDEFORMVERT
#define CD_MASK_PROP_FLOAT2
#define DNA_struct_default_get(struct_name)
@ 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 void init_data(ModifierData *md)
static void panel_register(ARegionType *region_type)
static void free_runtime_data(void *runtime_data_v)
static Mesh * modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static bool is_brush_cb(Object *, ModifierData *md)
static void free_data(ModifierData *md)
ModifierTypeInfo modifierType_DynamicPaint
static void panel_draw(const bContext *, Panel *panel)
static bool depends_on_time(Scene *, ModifierData *)
static void required_data_mask(ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
static void foreach_tex_link(ModifierData *, Object *, TexWalkFunc, void *)
static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void uiItemL(uiLayout *layout, const char *name, int icon)
struct DynamicPaintCanvasSettings * canvas
struct DynamicPaintBrushSettings * brush
Definition DNA_ID.h:413
void * first
ModifierApplyFlag flag
struct uiLayout * layout
#define N_(msgid)
PointerRNA * ptr
Definition wm_files.cc:4126
uint8_t flag
Definition wm_window.cc:138