New modifier type: eModifierTypeType_NonGeometrical, for modifiers affecting CustomData layers only (e.g. UVProject and WeightVG ones).
Also, allow applying to obdata those modifiers, even with shapekeys, but do not allow applying them *as* shapekey (as shapekeys do not have CD layers). Fix [#29636] Vertex Weight Mix modifier "apply" button don't work. Note: applying whit shape keys currently always uses base shape, not current one (for apply to obdata as well as apply to shapekey), but this is another topic...
This commit is contained in:
@@ -65,6 +65,11 @@ typedef enum {
|
||||
* unless it's a mesh and can be exploded -> curve can also emit particles
|
||||
*/
|
||||
eModifierTypeType_DeformOrConstruct,
|
||||
|
||||
/* Like eModifierTypeType_Nonconstructive, but does not affect the geometry
|
||||
* of the object, rather some of its CustomData layers.
|
||||
* E.g. UVProject and WeightVG modifiers. */
|
||||
eModifierTypeType_NonGeometrical,
|
||||
} ModifierTypeType;
|
||||
|
||||
typedef enum {
|
||||
@@ -311,6 +316,7 @@ int modifier_supportsMapping(struct ModifierData *md);
|
||||
int modifier_couldBeCage(struct Scene *scene, struct ModifierData *md);
|
||||
int modifier_isCorrectableDeformed(struct ModifierData *md);
|
||||
int modifier_sameTopology(ModifierData *md);
|
||||
int modifier_nonGeometrical(ModifierData *md);
|
||||
int modifier_isEnabled(struct Scene *scene, struct ModifierData *md, int required_mode);
|
||||
void modifier_setError(struct ModifierData *md, const char *format, ...)
|
||||
#ifdef __GNUC__
|
||||
|
@@ -239,7 +239,14 @@ int modifier_couldBeCage(struct Scene *scene, ModifierData *md)
|
||||
int modifier_sameTopology(ModifierData *md)
|
||||
{
|
||||
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
|
||||
return ( mti->type == eModifierTypeType_OnlyDeform || mti->type == eModifierTypeType_Nonconstructive);
|
||||
return ELEM3(mti->type, eModifierTypeType_OnlyDeform, eModifierTypeType_Nonconstructive,
|
||||
eModifierTypeType_NonGeometrical);
|
||||
}
|
||||
|
||||
int modifier_nonGeometrical(ModifierData *md)
|
||||
{
|
||||
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
|
||||
return (mti->type == eModifierTypeType_NonGeometrical);
|
||||
}
|
||||
|
||||
void modifier_setError(ModifierData *md, const char *format, ...)
|
||||
|
@@ -845,7 +845,7 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
|
||||
uiLayoutSetOperatorContext(row, WM_OP_INVOKE_DEFAULT);
|
||||
uiItemEnumO(row, "OBJECT_OT_modifier_apply", IFACE_("Apply"), 0, "apply_as", MODIFIER_APPLY_DATA);
|
||||
|
||||
if (modifier_sameTopology(md))
|
||||
if (modifier_sameTopology(md) && !modifier_nonGeometrical(md))
|
||||
uiItemEnumO(row, "OBJECT_OT_modifier_apply", IFACE_("Apply as Shape"), 0, "apply_as", MODIFIER_APPLY_SHAPE);
|
||||
}
|
||||
|
||||
@@ -853,7 +853,7 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
|
||||
uiBlockSetButLock(block, ob && ob->id.lib, ERROR_LIBDATA_MESSAGE);
|
||||
|
||||
if (!ELEM5(md->type, eModifierType_Fluidsim, eModifierType_Softbody, eModifierType_ParticleSystem, eModifierType_Cloth, eModifierType_Smoke))
|
||||
uiItemO(row, TIP_("Copy"), ICON_NONE, "OBJECT_OT_modifier_copy");
|
||||
uiItemO(row, IFACE_("Copy"), ICON_NONE, "OBJECT_OT_modifier_copy");
|
||||
}
|
||||
|
||||
/* result is the layout block inside the box, that we return so that modifier settings can be drawn */
|
||||
|
@@ -452,7 +452,7 @@ static int modifier_apply_shape(ReportList *reports, Scene *scene, Object *ob, M
|
||||
Key *key=me->key;
|
||||
KeyBlock *kb;
|
||||
|
||||
if(!modifier_sameTopology(md)) {
|
||||
if(!modifier_sameTopology(md) || mti->type == eModifierTypeType_NonGeometrical) {
|
||||
BKE_report(reports, RPT_ERROR, "Only deforming modifiers can be applied to Shapes");
|
||||
return 0;
|
||||
}
|
||||
@@ -500,7 +500,7 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob,
|
||||
Mesh *me = ob->data;
|
||||
MultiresModifierData *mmd= find_multires_modifier_before(scene, md);
|
||||
|
||||
if( me->key) {
|
||||
if(me->key && mti->type != eModifierTypeType_NonGeometrical) {
|
||||
BKE_report(reports, RPT_ERROR, "Modifier cannot be applied to Mesh with Shape Keys");
|
||||
return 0;
|
||||
}
|
||||
|
@@ -407,7 +407,7 @@ ModifierTypeInfo modifierType_UVProject = {
|
||||
/* name */ "UVProject",
|
||||
/* structName */ "UVProjectModifierData",
|
||||
/* structSize */ sizeof(UVProjectModifierData),
|
||||
/* type */ eModifierTypeType_Nonconstructive,
|
||||
/* type */ eModifierTypeType_NonGeometrical,
|
||||
/* flags */ eModifierTypeFlag_AcceptsMesh
|
||||
| eModifierTypeFlag_SupportsMapping
|
||||
| eModifierTypeFlag_SupportsEditmode
|
||||
|
@@ -254,7 +254,7 @@ ModifierTypeInfo modifierType_WeightVGEdit = {
|
||||
/* name */ "VertexWeightEdit",
|
||||
/* structName */ "WeightVGEditModifierData",
|
||||
/* structSize */ sizeof(WeightVGEditModifierData),
|
||||
/* type */ eModifierTypeType_Nonconstructive,
|
||||
/* type */ eModifierTypeType_NonGeometrical,
|
||||
/* flags */ eModifierTypeFlag_AcceptsMesh
|
||||
/* |eModifierTypeFlag_SupportsMapping*/
|
||||
|eModifierTypeFlag_SupportsEditmode,
|
||||
|
@@ -386,7 +386,7 @@ ModifierTypeInfo modifierType_WeightVGMix = {
|
||||
/* name */ "VertexWeightMix",
|
||||
/* structName */ "WeightVGMixModifierData",
|
||||
/* structSize */ sizeof(WeightVGMixModifierData),
|
||||
/* type */ eModifierTypeType_Nonconstructive,
|
||||
/* type */ eModifierTypeType_NonGeometrical,
|
||||
/* flags */ eModifierTypeFlag_AcceptsMesh
|
||||
/* |eModifierTypeFlag_SupportsMapping*/
|
||||
|eModifierTypeFlag_SupportsEditmode,
|
||||
|
@@ -520,7 +520,7 @@ ModifierTypeInfo modifierType_WeightVGProximity = {
|
||||
/* name */ "VertexWeightProximity",
|
||||
/* structName */ "WeightVGProximityModifierData",
|
||||
/* structSize */ sizeof(WeightVGProximityModifierData),
|
||||
/* type */ eModifierTypeType_Nonconstructive,
|
||||
/* type */ eModifierTypeType_NonGeometrical,
|
||||
/* flags */ eModifierTypeFlag_AcceptsMesh
|
||||
/* |eModifierTypeFlag_SupportsMapping*/
|
||||
|eModifierTypeFlag_SupportsEditmode,
|
||||
|
Reference in New Issue
Block a user