Changeset View
Changeset View
Standalone View
Standalone View
source/blender/modifiers/intern/MOD_smoke.c
| Show First 20 Lines • Show All 48 Lines • ▼ Show 20 Lines | |||||
| #include "MOD_modifiertypes.h" | #include "MOD_modifiertypes.h" | ||||
| static void initData(ModifierData *md) | static void initData(ModifierData *md) | ||||
| { | { | ||||
| SmokeModifierData *smd = (SmokeModifierData *) md; | SmokeModifierData *smd = (SmokeModifierData *) md; | ||||
| smd->domain = NULL; | smd->domain = NULL; | ||||
| smd->flow = NULL; | smd->flow = NULL; | ||||
| smd->coll = NULL; | smd->effec = NULL; | ||||
| smd->type = 0; | smd->type = 0; | ||||
| smd->time = -1; | smd->time = -1; | ||||
| } | } | ||||
| static void copyData(const ModifierData *md, ModifierData *target, const int flag) | static void copyData(const ModifierData *md, ModifierData *target, const int flag) | ||||
| { | { | ||||
| const SmokeModifierData *smd = (const SmokeModifierData *)md; | const SmokeModifierData *smd = (const SmokeModifierData *)md; | ||||
| SmokeModifierData *tsmd = (SmokeModifierData *)target; | SmokeModifierData *tsmd = (SmokeModifierData *)target; | ||||
| Show All 9 Lines | static void freeData(ModifierData *md) | ||||
| smokeModifier_free(smd); | smokeModifier_free(smd); | ||||
| } | } | ||||
| static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks) | static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks) | ||||
| { | { | ||||
| SmokeModifierData *smd = (SmokeModifierData *)md; | SmokeModifierData *smd = (SmokeModifierData *)md; | ||||
| if (smd && (smd->type & MOD_SMOKE_TYPE_FLOW) && smd->flow) { | if (smd && (smd->type & MOD_SMOKE_TYPE_FLOW) && smd->flow) { | ||||
| if (smd->flow->source == MOD_SMOKE_FLOW_SOURCE_MESH) { | if (smd->flow->source == FLUID_FLOW_SOURCE_MESH) { | ||||
| /* vertex groups */ | /* vertex groups */ | ||||
| if (smd->flow->vgroup_density) | if (smd->flow->vgroup_density) | ||||
| r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT; | r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT; | ||||
| /* uv layer */ | /* uv layer */ | ||||
| if (smd->flow->texture_type == MOD_SMOKE_FLOW_TEXTURE_MAP_UV) | if (smd->flow->texture_type == FLUID_FLOW_TEXTURE_MAP_UV) | ||||
| r_cddata_masks->fmask |= CD_MASK_MTFACE; | r_cddata_masks->fmask |= CD_MASK_MTFACE; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static Mesh *applyModifier( | static Mesh *applyModifier( | ||||
| ModifierData *md, const ModifierEvalContext *ctx, | ModifierData *md, const ModifierEvalContext *ctx, | ||||
| Mesh *me) | Mesh *me) | ||||
| { | { | ||||
| SmokeModifierData *smd = (SmokeModifierData *) md; | SmokeModifierData *smd = (SmokeModifierData *) md; | ||||
| Mesh *result = NULL; | |||||
| if (ctx->flag & MOD_APPLY_ORCO) { | if (ctx->flag & MOD_APPLY_ORCO) { | ||||
| return me; | return me; | ||||
| } | } | ||||
| Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); | Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); | ||||
| return smokeModifier_do(smd, ctx->depsgraph, scene, ctx->object, me); | |||||
| result = smokeModifier_do(smd, ctx->depsgraph, scene, ctx->object, me); | |||||
| return result ? result : me; | |||||
| } | } | ||||
| static bool dependsOnTime(ModifierData *UNUSED(md)) | static bool dependsOnTime(ModifierData *UNUSED(md)) | ||||
| { | { | ||||
| return true; | return true; | ||||
| } | } | ||||
| static bool is_flow_cb(Object *UNUSED(ob), ModifierData *md) | static bool is_flow_cb(Object *UNUSED(ob), ModifierData *md) | ||||
| { | { | ||||
| SmokeModifierData *smd = (SmokeModifierData *) md; | SmokeModifierData *smd = (SmokeModifierData *) md; | ||||
| return (smd->type & MOD_SMOKE_TYPE_FLOW) && smd->flow; | return (smd->type & MOD_SMOKE_TYPE_FLOW) && smd->flow; | ||||
| } | } | ||||
| static bool is_coll_cb(Object *UNUSED(ob), ModifierData *md) | static bool is_coll_cb(Object *UNUSED(ob), ModifierData *md) | ||||
| { | { | ||||
| SmokeModifierData *smd = (SmokeModifierData *) md; | SmokeModifierData *smd = (SmokeModifierData *) md; | ||||
| return (smd->type & MOD_SMOKE_TYPE_COLL) && smd->coll; | return (smd->type & MOD_SMOKE_TYPE_EFFEC) && smd->effec; | ||||
| } | } | ||||
| static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) | static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) | ||||
| { | { | ||||
| SmokeModifierData *smd = (SmokeModifierData *)md; | SmokeModifierData *smd = (SmokeModifierData *)md; | ||||
| if (smd && (smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain) { | if (smd && (smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain) { | ||||
| DEG_add_collision_relations(ctx->node, ctx->object, smd->domain->fluid_group, eModifierType_Smoke, is_flow_cb, "Smoke Flow"); | DEG_add_collision_relations(ctx->node, ctx->object, smd->domain->fluid_group, eModifierType_Smoke, is_flow_cb, "Smoke Flow"); | ||||
| DEG_add_collision_relations(ctx->node, ctx->object, smd->domain->coll_group, eModifierType_Smoke, is_coll_cb, "Smoke Coll"); | DEG_add_collision_relations(ctx->node, ctx->object, smd->domain->coll_group, eModifierType_Smoke, is_coll_cb, "Smoke Coll"); | ||||
| DEG_add_forcefield_relations(ctx->node, ctx->object, smd->domain->effector_weights, true, PFIELD_SMOKEFLOW, "Smoke Force Field"); | DEG_add_forcefield_relations(ctx->node, ctx->object, smd->domain->effector_weights, true, PFIELD_SMOKEFLOW, "Smoke Force Field"); | ||||
| if (smd->domain->guiding_parent != NULL) { | |||||
| DEG_add_object_relation(ctx->node, smd->domain->guiding_parent, DEG_OB_COMP_TRANSFORM, "Fluid Guiding Object"); | |||||
| DEG_add_object_relation(ctx->node, smd->domain->guiding_parent, DEG_OB_COMP_GEOMETRY, "Fluid Guiding Object"); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| static void foreachIDLink( | static void foreachIDLink( | ||||
| ModifierData *md, Object *ob, | ModifierData *md, Object *ob, | ||||
| IDWalkFunc walk, void *userData) | IDWalkFunc walk, void *userData) | ||||
| { | { | ||||
| SmokeModifierData *smd = (SmokeModifierData *) md; | SmokeModifierData *smd = (SmokeModifierData *) md; | ||||
| if (smd->type == MOD_SMOKE_TYPE_DOMAIN && smd->domain) { | if (smd->type == MOD_SMOKE_TYPE_DOMAIN && smd->domain) { | ||||
| walk(userData, ob, (ID **)&smd->domain->coll_group, IDWALK_CB_NOP); | walk(userData, ob, (ID **)&smd->domain->coll_group, IDWALK_CB_NOP); | ||||
| walk(userData, ob, (ID **)&smd->domain->fluid_group, IDWALK_CB_NOP); | walk(userData, ob, (ID **)&smd->domain->fluid_group, IDWALK_CB_NOP); | ||||
| walk(userData, ob, (ID **)&smd->domain->eff_group, IDWALK_CB_NOP); | walk(userData, ob, (ID **)&smd->domain->eff_group, IDWALK_CB_NOP); | ||||
| if (smd->domain->guiding_parent) { | |||||
| walk(userData, ob, (ID **)&smd->domain->guiding_parent, IDWALK_CB_NOP); | |||||
| } | |||||
| if (smd->domain->effector_weights) { | if (smd->domain->effector_weights) { | ||||
| walk(userData, ob, (ID **)&smd->domain->effector_weights->group, IDWALK_CB_NOP); | walk(userData, ob, (ID **)&smd->domain->effector_weights->group, IDWALK_CB_NOP); | ||||
| } | } | ||||
| } | } | ||||
| if (smd->type == MOD_SMOKE_TYPE_FLOW && smd->flow) { | if (smd->type == MOD_SMOKE_TYPE_FLOW && smd->flow) { | ||||
| walk(userData, ob, (ID **)&smd->flow->noise_texture, IDWALK_CB_USER); | walk(userData, ob, (ID **)&smd->flow->noise_texture, IDWALK_CB_USER); | ||||
| } | } | ||||
| Show All 37 Lines | |||||