Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/modifiers/intern/MOD_fluid.c')
-rw-r--r--source/blender/modifiers/intern/MOD_fluid.c211
1 files changed, 211 insertions, 0 deletions
diff --git a/source/blender/modifiers/intern/MOD_fluid.c b/source/blender/modifiers/intern/MOD_fluid.c
new file mode 100644
index 00000000000..aba9e352162
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_fluid.c
@@ -0,0 +1,211 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2005 by the Blender Foundation.
+ * All rights reserved.
+ */
+
+/** \file
+ * \ingroup modifiers
+ */
+
+#include <stddef.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_utildefines.h"
+
+#include "DNA_collection_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_fluid_types.h"
+#include "DNA_object_force_types.h"
+#include "DNA_mesh_types.h"
+
+#include "BKE_cdderivedmesh.h"
+#include "BKE_layer.h"
+#include "BKE_library_query.h"
+#include "BKE_modifier.h"
+#include "BKE_fluid.h"
+
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_build.h"
+#include "DEG_depsgraph_physics.h"
+#include "DEG_depsgraph_query.h"
+
+#include "MOD_modifiertypes.h"
+
+static void initData(ModifierData *md)
+{
+ FluidModifierData *mmd = (FluidModifierData *)md;
+
+ mmd->domain = NULL;
+ mmd->flow = NULL;
+ mmd->effector = NULL;
+ mmd->type = 0;
+ mmd->time = -1;
+}
+
+static void copyData(const ModifierData *md, ModifierData *target, const int flag)
+{
+ const FluidModifierData *mmd = (const FluidModifierData *)md;
+ FluidModifierData *tmmd = (FluidModifierData *)target;
+
+ fluidModifier_free(tmmd);
+ fluidModifier_copy(mmd, tmmd, flag);
+}
+
+static void freeData(ModifierData *md)
+{
+ FluidModifierData *mmd = (FluidModifierData *)md;
+
+ fluidModifier_free(mmd);
+}
+
+static void requiredDataMask(Object *UNUSED(ob),
+ ModifierData *md,
+ CustomData_MeshMasks *r_cddata_masks)
+{
+ FluidModifierData *mmd = (FluidModifierData *)md;
+
+ if (mmd && (mmd->type & MOD_FLUID_TYPE_FLOW) && mmd->flow) {
+ if (mmd->flow->source == FLUID_FLOW_SOURCE_MESH) {
+ /* vertex groups */
+ if (mmd->flow->vgroup_density) {
+ r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
+ }
+ /* uv layer */
+ if (mmd->flow->texture_type == FLUID_FLOW_TEXTURE_MAP_UV) {
+ r_cddata_masks->fmask |= CD_MASK_MTFACE;
+ }
+ }
+ }
+}
+
+static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mesh *me)
+{
+ FluidModifierData *mmd = (FluidModifierData *)md;
+ Mesh *result = NULL;
+
+ if (ctx->flag & MOD_APPLY_ORCO) {
+ return me;
+ }
+
+ Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph);
+
+ result = fluidModifier_do(mmd, ctx->depsgraph, scene, ctx->object, me);
+ return result ? result : me;
+}
+
+static bool dependsOnTime(ModifierData *UNUSED(md))
+{
+ return true;
+}
+
+static bool is_flow_cb(Object *UNUSED(ob), ModifierData *md)
+{
+ FluidModifierData *mmd = (FluidModifierData *)md;
+ return (mmd->type & MOD_FLUID_TYPE_FLOW) && mmd->flow;
+}
+
+static bool is_coll_cb(Object *UNUSED(ob), ModifierData *md)
+{
+ FluidModifierData *mmd = (FluidModifierData *)md;
+ return (mmd->type & MOD_FLUID_TYPE_EFFEC) && mmd->effector;
+}
+
+static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
+{
+ FluidModifierData *mmd = (FluidModifierData *)md;
+
+ if (mmd && (mmd->type & MOD_FLUID_TYPE_DOMAIN) && mmd->domain) {
+ DEG_add_collision_relations(ctx->node,
+ ctx->object,
+ mmd->domain->fluid_group,
+ eModifierType_Fluid,
+ is_flow_cb,
+ "Fluid Flow");
+ DEG_add_collision_relations(ctx->node,
+ ctx->object,
+ mmd->domain->effector_group,
+ eModifierType_Fluid,
+ is_coll_cb,
+ "Fluid Effector");
+ DEG_add_forcefield_relations(ctx->node,
+ ctx->object,
+ mmd->domain->effector_weights,
+ true,
+ PFIELD_SMOKEFLOW,
+ "Fluid Force Field");
+
+ if (mmd->domain->guiding_parent != NULL) {
+ DEG_add_object_relation(
+ ctx->node, mmd->domain->guiding_parent, DEG_OB_COMP_TRANSFORM, "Fluid Guiding Object");
+ DEG_add_object_relation(
+ ctx->node, mmd->domain->guiding_parent, DEG_OB_COMP_GEOMETRY, "Fluid Guiding Object");
+ }
+ }
+}
+
+static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
+{
+ FluidModifierData *mmd = (FluidModifierData *)md;
+
+ if (mmd->type == MOD_FLUID_TYPE_DOMAIN && mmd->domain) {
+ walk(userData, ob, (ID **)&mmd->domain->effector_group, IDWALK_CB_NOP);
+ walk(userData, ob, (ID **)&mmd->domain->fluid_group, IDWALK_CB_NOP);
+ walk(userData, ob, (ID **)&mmd->domain->force_group, IDWALK_CB_NOP);
+
+ if (mmd->domain->guiding_parent) {
+ walk(userData, ob, (ID **)&mmd->domain->guiding_parent, IDWALK_CB_NOP);
+ }
+
+ if (mmd->domain->effector_weights) {
+ walk(userData, ob, (ID **)&mmd->domain->effector_weights->group, IDWALK_CB_NOP);
+ }
+ }
+
+ if (mmd->type == MOD_FLUID_TYPE_FLOW && mmd->flow) {
+ walk(userData, ob, (ID **)&mmd->flow->noise_texture, IDWALK_CB_USER);
+ }
+}
+
+ModifierTypeInfo modifierType_Fluid = {
+ /* name */ "Fluid",
+ /* structName */ "FluidModifierData",
+ /* structSize */ sizeof(FluidModifierData),
+ /* type */ eModifierTypeType_Constructive,
+ /* flags */ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_Single,
+
+ /* copyData */ copyData,
+
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ applyModifier,
+
+ /* initData */ initData,
+ /* requiredDataMask */ requiredDataMask,
+ /* freeData */ freeData,
+ /* isDisabled */ NULL,
+ /* updateDepsgraph */ updateDepsgraph,
+ /* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ foreachIDLink,
+ /* foreachTexLink */ NULL,
+ /* freeRuntimeData */ NULL,
+};