Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
- index d4b2c39bd5e..b3c5ac4c9b4 100644
- --- a/release/scripts/startup/bl_ui/properties_data_modifier.py
- +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
- @@ -1408,36 +1408,55 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
- col.prop(md, "min_vertices", text="")
- def UV_WARP(self, layout, ob, md):
- + is_transform = md.source == 'TRANSFORM'
- +
- + layout.prop(md, "source")
- +
- split = layout.split()
- col = split.column()
- col.prop(md, "center")
- col = split.column()
- + col.active = is_transform
- col.label(text="UV Axis:")
- col.prop(md, "axis_u", text="")
- col.prop(md, "axis_v", text="")
- - split = layout.split()
- - col = split.column()
- - col.label(text="From:")
- - col.prop(md, "object_from", text="")
- + if is_transform:
- + split = layout.split()
- + col = split.column()
- + col.label(text="From:")
- + col.prop(md, "object_from", text="")
- - col = split.column()
- - col.label(text="To:")
- - col.prop(md, "object_to", text="")
- + col = split.column()
- + col.label(text="To:")
- + col.prop(md, "object_to", text="")
- - split = layout.split()
- - col = split.column()
- - obj = md.object_from
- - if obj and obj.type == 'ARMATURE':
- - col.label(text="Bone:")
- - col.prop_search(md, "bone_from", obj.data, "bones", text="")
- + split = layout.split()
- + col = split.column()
- + obj = md.object_from
- + if obj and obj.type == 'ARMATURE':
- + col.label(text="Bone:")
- + col.prop_search(md, "bone_from", obj.data, "bones", text="")
- - col = split.column()
- - obj = md.object_to
- - if obj and obj.type == 'ARMATURE':
- - col.label(text="Bone:")
- - col.prop_search(md, "bone_to", obj.data, "bones", text="")
- + col = split.column()
- + obj = md.object_to
- + if obj and obj.type == 'ARMATURE':
- + col.label(text="Bone:")
- + col.prop_search(md, "bone_to", obj.data, "bones", text="")
- + else:
- + split = layout.split()
- + col = split.column()
- + col.label(text="Offset:")
- + col.prop(md, "offset", text="")
- +
- + col = split.column()
- + col.label(text="Scale:")
- + col.prop(md, "scale", text="")
- +
- + col = split.column()
- + col.label(text="Rotate:")
- + col.prop(md, "rotation", text="")
- split = layout.split()
- diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
- index 0754e59cb8a..30f15f12665 100644
- --- a/source/blender/blenloader/intern/versioning_280.c
- +++ b/source/blender/blenloader/intern/versioning_280.c
- @@ -4390,5 +4390,16 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
- br->pose_ik_segments = 1;
- }
- }
- +
- + if (!DNA_struct_elem_find(fd->filesdna, "UVWarpModifierData", "float", "scale[2]")) {
- + for (Object *ob = bmain->objects.first; ob; ob = ob->id.next) {
- + for (ModifierData *md = ob->modifiers.first; md; md = md->next) {
- + if (md->type == eModifierType_UVWarp) {
- + UVWarpModifierData *umd = (UVWarpModifierData *)md;
- + copy_v2_fl(umd->scale, 1.0f);
- + }
- + }
- + }
- + }
- }
- }
- diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
- index 9db993cca59..4bbe18d4550 100644
- --- a/source/blender/makesdna/DNA_modifier_types.h
- +++ b/source/blender/makesdna/DNA_modifier_types.h
- @@ -1703,10 +1703,15 @@ typedef struct UVWarpModifierData {
- ModifierData modifier;
- char axis_u, axis_v;
- - char _pad[6];
- + char source;
- + char _pad;
- /** Used for rotate/scale. */
- float center[2];
- + float offset[2];
- + float scale[2];
- + float rotation;
- +
- /** Source. */
- struct Object *object_src;
- /** Optional name of bone target, MAX_ID_NAME-2. */
- @@ -1722,6 +1727,11 @@ typedef struct UVWarpModifierData {
- char uvlayer_name[64];
- } UVWarpModifierData;
- +enum {
- + MOD_UVWARP_SOURCE_TRANSFORM = 0,
- + MOD_UVWARP_SOURCE_FIXED = 1,
- +};
- +
- /* cache modifier */
- typedef struct MeshCacheModifierData {
- ModifierData modifier;
- diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
- index 589ce1414bb..d6f969f35eb 100644
- --- a/source/blender/makesrna/intern/rna_modifier.c
- +++ b/source/blender/makesrna/intern/rna_modifier.c
- @@ -4539,6 +4539,16 @@ static void rna_def_modifier_screw(BlenderRNA *brna)
- static void rna_def_modifier_uvwarp(BlenderRNA *brna)
- {
- + static const EnumPropertyItem source_items[] = {
- + {MOD_UVWARP_SOURCE_TRANSFORM, "TRANSFORM", 0, "Transform", "Get warp from transforms of two objects/bones"},
- + {MOD_UVWARP_SOURCE_FIXED,
- + "FIXED",
- + 0,
- + "Fixed",
- + "Get warp from fixed values in the modifier"},
- + {0, NULL, 0, NULL, NULL},
- + };
- +
- StructRNA *srna;
- PropertyRNA *prop;
- @@ -4559,11 +4569,32 @@ static void rna_def_modifier_uvwarp(BlenderRNA *brna)
- RNA_def_property_ui_text(prop, "V-Axis", "Pole axis for rotation");
- RNA_def_property_update(prop, 0, "rna_Modifier_update");
- + prop = RNA_def_property(srna, "source", PROP_ENUM, PROP_NONE);
- + RNA_def_property_enum_sdna(prop, NULL, "source");
- + RNA_def_property_enum_items(prop, source_items);
- + RNA_def_property_ui_text(prop, "Source", "Source for the warp");
- + RNA_def_property_update(prop, 0, "rna_Modifier_update");
- +
- prop = RNA_def_property(srna, "center", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "center");
- RNA_def_property_ui_text(prop, "UV Center", "Center point for rotate/scale");
- RNA_def_property_update(prop, 0, "rna_Modifier_update");
- + prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE);
- + RNA_def_property_float_sdna(prop, NULL, "offset");
- + RNA_def_property_ui_text(prop, "Offset", "Offset");
- + RNA_def_property_update(prop, 0, "rna_Modifier_update");
- +
- + prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_NONE);
- + RNA_def_property_float_sdna(prop, NULL, "scale");
- + RNA_def_property_ui_text(prop, "Scale", "Scale");
- + RNA_def_property_update(prop, 0, "rna_Modifier_update");
- +
- + prop = RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_ANGLE);
- + RNA_def_property_float_sdna(prop, NULL, "rotation");
- + RNA_def_property_ui_text(prop, "Rotation", "Rotation");
- + RNA_def_property_update(prop, 0, "rna_Modifier_update");
- +
- prop = RNA_def_property(srna, "object_from", PROP_POINTER, PROP_NONE);
- RNA_def_property_pointer_sdna(prop, NULL, "object_src");
- RNA_def_property_ui_text(prop, "Object From", "Object defining offset");
- diff --git a/source/blender/modifiers/intern/MOD_uvwarp.c b/source/blender/modifiers/intern/MOD_uvwarp.c
- index 2c5f4b66c23..669eedc8bc0 100644
- --- a/source/blender/modifiers/intern/MOD_uvwarp.c
- +++ b/source/blender/modifiers/intern/MOD_uvwarp.c
- @@ -58,6 +58,7 @@ static void initData(ModifierData *md)
- umd->axis_u = 0;
- umd->axis_v = 1;
- copy_v2_fl(umd->center, 0.5f);
- + copy_v2_fl(umd->scale, 1.0f);
- }
- static void requiredDataMask(Object *UNUSED(ob),
- @@ -145,38 +146,54 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
- float mat_dst[4][4];
- float imat_dst[4][4];
- float warp_mat[4][4];
- - const int axis_u = umd->axis_u;
- - const int axis_v = umd->axis_v;
- + int axis_u = umd->axis_u;
- + int axis_v = umd->axis_v;
- /* make sure there are UV Maps available */
- if (!CustomData_has_layer(&mesh->ldata, CD_MLOOPUV)) {
- return mesh;
- }
- - else if (ELEM(NULL, umd->object_src, umd->object_dst)) {
- - modifier_setError(md, "From/To objects must be set");
- - return mesh;
- - }
- - /* make sure anything moving UVs is available */
- - matrix_from_obj_pchan(mat_src, umd->object_src, umd->bone_src);
- - matrix_from_obj_pchan(mat_dst, umd->object_dst, umd->bone_dst);
- - invert_m4_m4(imat_dst, mat_dst);
- - mul_m4_m4m4(warp_mat, imat_dst, mat_src);
- + if (umd->source == MOD_UVWARP_SOURCE_TRANSFORM) {
- + if (ELEM(NULL, umd->object_src, umd->object_dst)) {
- + modifier_setError(md, "From/To objects must be set");
- + return mesh;
- + }
- +
- + /* make sure anything moving UVs is available */
- + matrix_from_obj_pchan(mat_src, umd->object_src, umd->bone_src);
- + matrix_from_obj_pchan(mat_dst, umd->object_dst, umd->bone_dst);
- +
- + invert_m4_m4(imat_dst, mat_dst);
- + mul_m4_m4m4(warp_mat, imat_dst, mat_src);
- - /* apply warp */
- - if (!is_zero_v2(umd->center)) {
- - float mat_cent[4][4];
- - float imat_cent[4][4];
- + /* apply warp */
- + if (!is_zero_v2(umd->center)) {
- + float mat_cent[4][4];
- + float imat_cent[4][4];
- - unit_m4(mat_cent);
- - mat_cent[3][axis_u] = umd->center[0];
- - mat_cent[3][axis_v] = umd->center[1];
- + unit_m4(mat_cent);
- + mat_cent[3][axis_u] = umd->center[0];
- + mat_cent[3][axis_v] = umd->center[1];
- - invert_m4_m4(imat_cent, mat_cent);
- + invert_m4_m4(imat_cent, mat_cent);
- - mul_m4_m4m4(warp_mat, warp_mat, imat_cent);
- - mul_m4_m4m4(warp_mat, mat_cent, warp_mat);
- + mul_m4_m4m4(warp_mat, warp_mat, imat_cent);
- + mul_m4_m4m4(warp_mat, mat_cent, warp_mat);
- + }
- + }
- + else {
- + axis_u = 0;
- + axis_v = 1;
- +
- + unit_m4(warp_mat);
- + translate_m4(warp_mat, umd->center[0], umd->center[1], 0.0f);
- + const float scale[3] = {umd->scale[0], umd->scale[1], 1.0f};
- + rescale_m4(warp_mat, scale);
- + rotate_m4(warp_mat, 'Z', umd->rotation);
- + translate_m4(warp_mat, umd->offset[0], umd->offset[1], 0.0f);
- + translate_m4(warp_mat, -umd->center[0], -umd->center[1], 0.0f);
- }
- /* make sure we're using an existing layer */
- @@ -239,8 +256,10 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
- {
- UVWarpModifierData *umd = (UVWarpModifierData *)md;
- - uv_warp_deps_object_bone_new(ctx->node, umd->object_src, umd->bone_src);
- - uv_warp_deps_object_bone_new(ctx->node, umd->object_dst, umd->bone_dst);
- + if (umd->source == MOD_UVWARP_SOURCE_TRANSFORM) {
- + uv_warp_deps_object_bone_new(ctx->node, umd->object_src, umd->bone_src);
- + uv_warp_deps_object_bone_new(ctx->node, umd->object_dst, umd->bone_dst);
- + }
- DEG_add_modifier_to_transform_relation(ctx->node, "UVWarp Modifier");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement