Blender V5.0
MOD_fluid.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2005 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include <cstddef>
10
11#include "BLI_task.h"
12
13#include "BLT_translation.hh"
14
15#include "DNA_fluid_types.h"
17#include "DNA_object_types.h"
18#include "DNA_screen_types.h"
19
20#include "BKE_fluid.h"
21#include "BKE_lib_query.hh"
22#include "BKE_modifier.hh"
23
24#include "RNA_access.hh"
25
27#include "UI_resources.hh"
28
29#include "RNA_prototypes.hh"
30
31#include "DEG_depsgraph.hh"
35
36#include "MOD_ui_common.hh"
37
38static void init_data(ModifierData *md)
39{
41
42 fmd->domain = nullptr;
43 fmd->flow = nullptr;
44 fmd->effector = nullptr;
45 fmd->type = 0;
46 fmd->time = -1;
47}
48
49static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
50{
51 const FluidModifierData *fmd = (const FluidModifierData *)md;
52 FluidModifierData *tfmd = (FluidModifierData *)target;
53
55 BKE_fluid_modifier_copy(fmd, tfmd, flag);
56}
57
58static void free_data(ModifierData *md)
59{
61
63}
64
65static void required_data_mask(ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
66{
68
69 if (fmd && (fmd->type & MOD_FLUID_TYPE_FLOW) && fmd->flow) {
70 if (fmd->flow->source == FLUID_FLOW_SOURCE_MESH) {
71 /* vertex groups */
72 if (fmd->flow->vgroup_density) {
73 r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
74 }
75 /* uv layer */
77 r_cddata_masks->fmask |= CD_MASK_MTFACE;
78 }
79 }
80 }
81}
82
91
92#ifdef WITH_FLUID
93static void fluid_modifier_do_isolated(void *userdata)
94{
95 FluidIsolationData *isolation_data = (FluidIsolationData *)userdata;
96
97 Scene *scene = DEG_get_evaluated_scene(isolation_data->depsgraph);
98
99 Mesh *result = BKE_fluid_modifier_do(isolation_data->fmd,
100 isolation_data->depsgraph,
101 scene,
102 isolation_data->object,
103 isolation_data->mesh);
104 isolation_data->result = result ? result : isolation_data->mesh;
105}
106#endif /* WITH_FLUID */
107
108static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
109{
110#ifndef WITH_FLUID
111 UNUSED_VARS(md, ctx);
112 return mesh;
113#else
115
116 if (ctx->flag & MOD_APPLY_ORCO) {
117 return mesh;
118 }
119
120 /* Isolate execution of Mantaflow when running from dependency graph. The reason for this is
121 * because Mantaflow uses TBB to parallel its own computation which without isolation will start
122 * stealing tasks from dependency graph. Stealing tasks from the dependency graph might cause
123 * a recursive lock when Python drivers are used (because Mantaflow is interfaced via Python as
124 * well. */
125 FluidIsolationData isolation_data;
126 isolation_data.depsgraph = ctx->depsgraph;
127 isolation_data.object = ctx->object;
128 isolation_data.mesh = mesh;
129 isolation_data.fmd = fmd;
130 BLI_task_isolate(fluid_modifier_do_isolated, &isolation_data);
131
132 return isolation_data.result;
133#endif /* WITH_FLUID */
134}
135
136static bool depends_on_time(Scene * /*scene*/, ModifierData * /*md*/)
137{
138 return true;
139}
140
141static bool is_flow_cb(Object * /*ob*/, ModifierData *md)
142{
144 return (fmd->type & MOD_FLUID_TYPE_FLOW) && fmd->flow;
145}
146
147static bool is_coll_cb(Object * /*ob*/, ModifierData *md)
148{
150 return (fmd->type & MOD_FLUID_TYPE_EFFEC) && fmd->effector;
151}
152
154{
156
157 if (fmd && (fmd->type & MOD_FLUID_TYPE_DOMAIN) && fmd->domain) {
159 ctx->object,
160 fmd->domain->fluid_group,
163 "Fluid Flow");
165 ctx->object,
169 "Fluid Effector");
171 ctx->object,
173 true,
175 "Fluid Force Field");
176
177 if (fmd->domain->guide_parent != nullptr) {
179 ctx->node, fmd->domain->guide_parent, DEG_OB_COMP_TRANSFORM, "Fluid Guiding Object");
181 ctx->node, fmd->domain->guide_parent, DEG_OB_COMP_GEOMETRY, "Fluid Guiding Object");
182 }
183 }
184}
185
186static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
187{
189
190 if (fmd->type == MOD_FLUID_TYPE_DOMAIN && fmd->domain) {
191 walk(user_data, ob, (ID **)&fmd->domain->effector_group, IDWALK_CB_NOP);
192 walk(user_data, ob, (ID **)&fmd->domain->fluid_group, IDWALK_CB_NOP);
193 walk(user_data, ob, (ID **)&fmd->domain->force_group, IDWALK_CB_NOP);
194
195 if (fmd->domain->guide_parent) {
196 walk(user_data, ob, (ID **)&fmd->domain->guide_parent, IDWALK_CB_NOP);
197 }
198
199 if (fmd->domain->effector_weights) {
200 walk(user_data, ob, (ID **)&fmd->domain->effector_weights->group, IDWALK_CB_USER);
201 }
202 }
203
204 if (fmd->type == MOD_FLUID_TYPE_FLOW && fmd->flow) {
205 walk(user_data, ob, (ID **)&fmd->flow->noise_texture, IDWALK_CB_USER);
206 }
207}
208
209static void foreach_tex_link(ModifierData *md, Object *ob, TexWalkFunc walk, void *user_data)
210{
212
213 if (fmd->type == MOD_FLUID_TYPE_FLOW && fmd->flow) {
214 PointerRNA ptr = RNA_pointer_create_discrete(&ob->id, &RNA_FluidFlowSettings, fmd->flow);
215 PropertyRNA *prop = RNA_struct_find_property(&ptr, "noise_texture");
216
217 walk(user_data, ob, md, &ptr, prop);
218 }
219}
220
221static void panel_draw(const bContext * /*C*/, Panel *panel)
222{
223 uiLayout *layout = panel->layout;
224
226
227 layout->label(RPT_("Settings are inside the Physics tab"), ICON_NONE);
228
230}
231
232static void panel_register(ARegionType *region_type)
233{
235}
236
238 /*idname*/ "Fluid",
239 /*name*/ N_("Fluid"),
240 /*struct_name*/ "FluidModifierData",
241 /*struct_size*/ sizeof(FluidModifierData),
242 /*srna*/ &RNA_FluidModifier,
245 /*icon*/ ICON_MOD_FLUIDSIM,
246
247 /*copy_data*/ copy_data,
248
249 /*deform_verts*/ nullptr,
250 /*deform_matrices*/ nullptr,
251 /*deform_verts_EM*/ nullptr,
252 /*deform_matrices_EM*/ nullptr,
253 /*modify_mesh*/ modify_mesh,
254 /*modify_geometry_set*/ nullptr,
255
256 /*init_data*/ init_data,
257 /*required_data_mask*/ required_data_mask,
258 /*free_data*/ free_data,
259 /*is_disabled*/ nullptr,
260 /*update_depsgraph*/ update_depsgraph,
261 /*depends_on_time*/ depends_on_time,
262 /*depends_on_normals*/ nullptr,
263 /*foreach_ID_link*/ foreach_ID_link,
264 /*foreach_tex_link*/ foreach_tex_link,
265 /*free_runtime_data*/ nullptr,
266 /*panel_register*/ panel_register,
267 /*blend_write*/ nullptr,
268 /*blend_read*/ nullptr,
269 /*foreach_cache*/ nullptr,
270 /*foreach_working_space_color*/ nullptr,
271};
struct Mesh * BKE_fluid_modifier_do(struct FluidModifierData *fmd, struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct Mesh *mesh)
void BKE_fluid_modifier_copy(const struct FluidModifierData *fmd, struct FluidModifierData *tfmd, int flag)
void BKE_fluid_modifier_free(struct FluidModifierData *fmd)
Definition fluid.cc:4764
@ IDWALK_CB_USER
@ IDWALK_CB_NOP
void(*)(void *user_data, Object *ob, ID **idpoin, LibraryForeachIDCallbackFlag cb_flag) IDWalkFunc
@ eModifierTypeFlag_Single
@ eModifierTypeFlag_AcceptsMesh
void(*)(void *user_data, Object *ob, ModifierData *md, const PointerRNA *ptr, PropertyRNA *texture_prop) TexWalkFunc
@ MOD_APPLY_ORCO
void BLI_task_isolate(void(*func)(void *userdata), void *userdata)
#define UNUSED_VARS(...)
#define RPT_(msgid)
void DEG_add_object_relation(DepsNodeHandle *node_handle, Object *object, eDepsObjectComponentType component, const char *description)
@ DEG_OB_COMP_GEOMETRY
@ DEG_OB_COMP_TRANSFORM
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_MDEFORMVERT
#define CD_MASK_MTFACE
@ FLUID_FLOW_TEXTURE_MAP_UV
@ FLUID_FLOW_SOURCE_MESH
@ MOD_FLUID_TYPE_EFFEC
@ MOD_FLUID_TYPE_DOMAIN
@ MOD_FLUID_TYPE_FLOW
@ eModifierType_Fluid
@ PFIELD_FLUIDFLOW
Object is a sort of wrapper for general info.
static void init_data(ModifierData *md)
static void panel_register(ARegionType *region_type)
static void required_data_mask(ModifierData *, CustomData_MeshMasks *r_cddata_masks)
static void panel_draw(const bContext *, Panel *panel)
static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
static Mesh * modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
Definition MOD_array.cc:862
static void free_data(ModifierData *md)
Definition MOD_bevel.cc:272
static bool depends_on_time(Scene *, ModifierData *)
Definition MOD_build.cc:47
static void foreach_tex_link(ModifierData *md, Object *ob, TexWalkFunc walk, void *user_data)
static void init_data(ModifierData *md)
Definition MOD_fluid.cc:38
static void panel_register(ARegionType *region_type)
Definition MOD_fluid.cc:232
static Mesh * modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
Definition MOD_fluid.cc:108
static void free_data(ModifierData *md)
Definition MOD_fluid.cc:58
ModifierTypeInfo modifierType_Fluid
Definition MOD_fluid.cc:237
static void panel_draw(const bContext *, Panel *panel)
Definition MOD_fluid.cc:221
static void foreach_tex_link(ModifierData *md, Object *ob, TexWalkFunc walk, void *user_data)
Definition MOD_fluid.cc:209
static bool depends_on_time(Scene *, ModifierData *)
Definition MOD_fluid.cc:136
static void required_data_mask(ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
Definition MOD_fluid.cc:65
static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
Definition MOD_fluid.cc:186
static bool is_coll_cb(Object *, ModifierData *md)
Definition MOD_fluid.cc:147
static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
Definition MOD_fluid.cc:153
static bool is_flow_cb(Object *, ModifierData *md)
Definition MOD_fluid.cc:141
static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
Definition MOD_fluid.cc:49
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_error_message_draw(uiLayout *layout, PointerRNA *ptr)
static void update_depsgraph(tGraphSliderOp *gso)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
struct Collection * group
struct Collection * force_group
struct Collection * effector_group
struct Object * guide_parent
struct Collection * fluid_group
struct EffectorWeights * effector_weights
struct Tex * noise_texture
FluidModifierData * fmd
Definition MOD_fluid.cc:87
Depsgraph * depsgraph
Definition MOD_fluid.cc:84
struct FluidDomainSettings * domain
struct FluidEffectorSettings * effector
struct FluidFlowSettings * flow
Definition DNA_ID.h:414
ModifierApplyFlag flag
struct uiLayout * layout
void label(blender::StringRef name, int icon)
#define N_(msgid)
PointerRNA * ptr
Definition wm_files.cc:4238
uint8_t flag
Definition wm_window.cc:145