Blender V4.3
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
9#include <cstddef>
10
11#include "MEM_guardedalloc.h"
12
13#include "BLI_task.h"
14#include "BLI_utildefines.h"
15
16#include "BLT_translation.hh"
17
18#include "DNA_fluid_types.h"
20#include "DNA_object_types.h"
21#include "DNA_screen_types.h"
22
23#include "BKE_fluid.h"
24#include "BKE_lib_query.hh"
25#include "BKE_modifier.hh"
26
27#include "RNA_access.hh"
28
29#include "UI_interface.hh"
30#include "UI_resources.hh"
31
32#include "RNA_prototypes.hh"
33
34#include "DEG_depsgraph.hh"
38
39#include "MOD_ui_common.hh"
40
41static void init_data(ModifierData *md)
42{
44
45 fmd->domain = nullptr;
46 fmd->flow = nullptr;
47 fmd->effector = nullptr;
48 fmd->type = 0;
49 fmd->time = -1;
50}
51
52static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
53{
54 const FluidModifierData *fmd = (const FluidModifierData *)md;
55 FluidModifierData *tfmd = (FluidModifierData *)target;
56
58 BKE_fluid_modifier_copy(fmd, tfmd, flag);
59}
60
61static void free_data(ModifierData *md)
62{
64
66}
67
68static void required_data_mask(ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
69{
71
72 if (fmd && (fmd->type & MOD_FLUID_TYPE_FLOW) && fmd->flow) {
73 if (fmd->flow->source == FLUID_FLOW_SOURCE_MESH) {
74 /* vertex groups */
75 if (fmd->flow->vgroup_density) {
76 r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
77 }
78 /* uv layer */
80 r_cddata_masks->fmask |= CD_MASK_MTFACE;
81 }
82 }
83 }
84}
85
94
95#ifdef WITH_FLUID
96static void fluid_modifier_do_isolated(void *userdata)
97{
98 FluidIsolationData *isolation_data = (FluidIsolationData *)userdata;
99
100 Scene *scene = DEG_get_evaluated_scene(isolation_data->depsgraph);
101
102 Mesh *result = BKE_fluid_modifier_do(isolation_data->fmd,
103 isolation_data->depsgraph,
104 scene,
105 isolation_data->object,
106 isolation_data->mesh);
107 isolation_data->result = result ? result : isolation_data->mesh;
108}
109#endif /* WITH_FLUID */
110
111static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
112{
113#ifndef WITH_FLUID
114 UNUSED_VARS(md, ctx);
115 return mesh;
116#else
118
119 if (ctx->flag & MOD_APPLY_ORCO) {
120 return mesh;
121 }
122
123 /* Isolate execution of Mantaflow when running from dependency graph. The reason for this is
124 * because Mantaflow uses TBB to parallel its own computation which without isolation will start
125 * stealing tasks from dependency graph. Stealing tasks from the dependency graph might cause
126 * a recursive lock when Python drivers are used (because Mantaflow is interfaced via Python as
127 * well. */
128 FluidIsolationData isolation_data;
129 isolation_data.depsgraph = ctx->depsgraph;
130 isolation_data.object = ctx->object;
131 isolation_data.mesh = mesh;
132 isolation_data.fmd = fmd;
133 BLI_task_isolate(fluid_modifier_do_isolated, &isolation_data);
134
135 return isolation_data.result;
136#endif /* WITH_FLUID */
137}
138
139static bool depends_on_time(Scene * /*scene*/, ModifierData * /*md*/)
140{
141 return true;
142}
143
144static bool is_flow_cb(Object * /*ob*/, ModifierData *md)
145{
147 return (fmd->type & MOD_FLUID_TYPE_FLOW) && fmd->flow;
148}
149
150static bool is_coll_cb(Object * /*ob*/, ModifierData *md)
151{
153 return (fmd->type & MOD_FLUID_TYPE_EFFEC) && fmd->effector;
154}
155
157{
159
160 if (fmd && (fmd->type & MOD_FLUID_TYPE_DOMAIN) && fmd->domain) {
162 ctx->object,
163 fmd->domain->fluid_group,
166 "Fluid Flow");
168 ctx->object,
172 "Fluid Effector");
174 ctx->object,
176 true,
178 "Fluid Force Field");
179
180 if (fmd->domain->guide_parent != nullptr) {
182 ctx->node, fmd->domain->guide_parent, DEG_OB_COMP_TRANSFORM, "Fluid Guiding Object");
184 ctx->node, fmd->domain->guide_parent, DEG_OB_COMP_GEOMETRY, "Fluid Guiding Object");
185 }
186 }
187}
188
189static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
190{
192
193 if (fmd->type == MOD_FLUID_TYPE_DOMAIN && fmd->domain) {
194 walk(user_data, ob, (ID **)&fmd->domain->effector_group, IDWALK_CB_NOP);
195 walk(user_data, ob, (ID **)&fmd->domain->fluid_group, IDWALK_CB_NOP);
196 walk(user_data, ob, (ID **)&fmd->domain->force_group, IDWALK_CB_NOP);
197
198 if (fmd->domain->guide_parent) {
199 walk(user_data, ob, (ID **)&fmd->domain->guide_parent, IDWALK_CB_NOP);
200 }
201
202 if (fmd->domain->effector_weights) {
203 walk(user_data, ob, (ID **)&fmd->domain->effector_weights->group, IDWALK_CB_USER);
204 }
205 }
206
207 if (fmd->type == MOD_FLUID_TYPE_FLOW && fmd->flow) {
208 walk(user_data, ob, (ID **)&fmd->flow->noise_texture, IDWALK_CB_USER);
209 }
210}
211
212static void foreach_tex_link(ModifierData *md, Object *ob, TexWalkFunc walk, void *user_data)
213{
215
216 if (fmd->type == MOD_FLUID_TYPE_FLOW && fmd->flow) {
217 PointerRNA ptr = RNA_pointer_create(&ob->id, &RNA_FluidFlowSettings, fmd->flow);
218 PropertyRNA *prop = RNA_struct_find_property(&ptr, "noise_texture");
219
220 walk(user_data, ob, md, &ptr, prop);
221 }
222}
223
224static void panel_draw(const bContext * /*C*/, Panel *panel)
225{
226 uiLayout *layout = panel->layout;
227
229
230 uiItemL(layout, RPT_("Settings are inside the Physics tab"), ICON_NONE);
231
232 modifier_panel_end(layout, ptr);
233}
234
235static void panel_register(ARegionType *region_type)
236{
238}
239
241 /*idname*/ "Fluid",
242 /*name*/ N_("Fluid"),
243 /*struct_name*/ "FluidModifierData",
244 /*struct_size*/ sizeof(FluidModifierData),
245 /*srna*/ &RNA_FluidModifier,
248 /*icon*/ ICON_MOD_FLUIDSIM,
249
250 /*copy_data*/ copy_data,
251
252 /*deform_verts*/ nullptr,
253 /*deform_matrices*/ nullptr,
254 /*deform_verts_EM*/ nullptr,
255 /*deform_matrices_EM*/ nullptr,
256 /*modify_mesh*/ modify_mesh,
257 /*modify_geometry_set*/ nullptr,
258
259 /*init_data*/ init_data,
260 /*required_data_mask*/ required_data_mask,
261 /*free_data*/ free_data,
262 /*is_disabled*/ nullptr,
263 /*update_depsgraph*/ update_depsgraph,
264 /*depends_on_time*/ depends_on_time,
265 /*depends_on_normals*/ nullptr,
266 /*foreach_ID_link*/ foreach_ID_link,
267 /*foreach_tex_link*/ foreach_tex_link,
268 /*free_runtime_data*/ nullptr,
269 /*panel_register*/ panel_register,
270 /*blend_write*/ nullptr,
271 /*blend_read*/ nullptr,
272 /*foreach_cache*/ nullptr,
273};
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:4795
@ IDWALK_CB_USER
@ IDWALK_CB_NOP
void(*)(void *user_data, Object *ob, ModifierData *md, const PointerRNA *ptr, PropertyRNA *texture_prop) TexWalkFunc
@ eModifierTypeFlag_Single
@ eModifierTypeFlag_AcceptsMesh
void(*)(void *user_data, Object *ob, ID **idpoin, int cb_flag) IDWalkFunc
@ 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_SOURCE_MESH
@ FLUID_FLOW_TEXTURE_MAP_UV
@ MOD_FLUID_TYPE_EFFEC
@ MOD_FLUID_TYPE_DOMAIN
@ MOD_FLUID_TYPE_FLOW
struct FluidModifierData FluidModifierData
@ eModifierType_Fluid
@ PFIELD_FLUIDFLOW
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
static void init_data(ModifierData *md)
Definition MOD_fluid.cc:41
static void panel_register(ARegionType *region_type)
Definition MOD_fluid.cc:235
static Mesh * modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
Definition MOD_fluid.cc:111
static void free_data(ModifierData *md)
Definition MOD_fluid.cc:61
ModifierTypeInfo modifierType_Fluid
Definition MOD_fluid.cc:240
static void panel_draw(const bContext *, Panel *panel)
Definition MOD_fluid.cc:224
static void foreach_tex_link(ModifierData *md, Object *ob, TexWalkFunc walk, void *user_data)
Definition MOD_fluid.cc:212
static bool depends_on_time(Scene *, ModifierData *)
Definition MOD_fluid.cc:139
static void required_data_mask(ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
Definition MOD_fluid.cc:68
static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
Definition MOD_fluid.cc:189
static bool is_coll_cb(Object *, ModifierData *md)
Definition MOD_fluid.cc:150
static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
Definition MOD_fluid.cc:156
static bool is_flow_cb(Object *, ModifierData *md)
Definition MOD_fluid.cc:144
static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
Definition MOD_fluid.cc:52
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)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
PointerRNA RNA_pointer_create(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:90
Depsgraph * depsgraph
Definition MOD_fluid.cc:87
struct FluidDomainSettings * domain
struct FluidEffectorSettings * effector
struct FluidFlowSettings * flow
Definition DNA_ID.h:413
ModifierApplyFlag flag
struct uiLayout * layout
#define N_(msgid)
PointerRNA * ptr
Definition wm_files.cc:4126
uint8_t flag
Definition wm_window.cc:138