Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 10.68 KB | None | 0 0
  1. diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
  2. index d4b2c39bd5e..b3c5ac4c9b4 100644
  3. --- a/release/scripts/startup/bl_ui/properties_data_modifier.py
  4. +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
  5. @@ -1408,36 +1408,55 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
  6.          col.prop(md, "min_vertices", text="")
  7.  
  8.      def UV_WARP(self, layout, ob, md):
  9. +        is_transform = md.source == 'TRANSFORM'
  10. +
  11. +        layout.prop(md, "source")
  12. +
  13.          split = layout.split()
  14.          col = split.column()
  15.          col.prop(md, "center")
  16.  
  17.          col = split.column()
  18. +        col.active = is_transform
  19.          col.label(text="UV Axis:")
  20.          col.prop(md, "axis_u", text="")
  21.          col.prop(md, "axis_v", text="")
  22.  
  23. -        split = layout.split()
  24. -        col = split.column()
  25. -        col.label(text="From:")
  26. -        col.prop(md, "object_from", text="")
  27. +        if is_transform:
  28. +            split = layout.split()
  29. +            col = split.column()
  30. +            col.label(text="From:")
  31. +            col.prop(md, "object_from", text="")
  32.  
  33. -        col = split.column()
  34. -        col.label(text="To:")
  35. -        col.prop(md, "object_to", text="")
  36. +            col = split.column()
  37. +            col.label(text="To:")
  38. +            col.prop(md, "object_to", text="")
  39.  
  40. -        split = layout.split()
  41. -        col = split.column()
  42. -        obj = md.object_from
  43. -        if obj and obj.type == 'ARMATURE':
  44. -            col.label(text="Bone:")
  45. -            col.prop_search(md, "bone_from", obj.data, "bones", text="")
  46. +            split = layout.split()
  47. +            col = split.column()
  48. +            obj = md.object_from
  49. +            if obj and obj.type == 'ARMATURE':
  50. +                col.label(text="Bone:")
  51. +                col.prop_search(md, "bone_from", obj.data, "bones", text="")
  52.  
  53. -        col = split.column()
  54. -        obj = md.object_to
  55. -        if obj and obj.type == 'ARMATURE':
  56. -            col.label(text="Bone:")
  57. -            col.prop_search(md, "bone_to", obj.data, "bones", text="")
  58. +            col = split.column()
  59. +            obj = md.object_to
  60. +            if obj and obj.type == 'ARMATURE':
  61. +                col.label(text="Bone:")
  62. +                col.prop_search(md, "bone_to", obj.data, "bones", text="")
  63. +        else:
  64. +            split = layout.split()
  65. +            col = split.column()
  66. +            col.label(text="Offset:")
  67. +            col.prop(md, "offset", text="")
  68. +
  69. +            col = split.column()
  70. +            col.label(text="Scale:")
  71. +            col.prop(md, "scale", text="")
  72. +
  73. +            col = split.column()
  74. +            col.label(text="Rotate:")
  75. +            col.prop(md, "rotation", text="")
  76.  
  77.          split = layout.split()
  78.  
  79. diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
  80. index 0754e59cb8a..30f15f12665 100644
  81. --- a/source/blender/blenloader/intern/versioning_280.c
  82. +++ b/source/blender/blenloader/intern/versioning_280.c
  83. @@ -4390,5 +4390,16 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
  84.          br->pose_ik_segments = 1;
  85.        }
  86.      }
  87. +
  88. +    if (!DNA_struct_elem_find(fd->filesdna, "UVWarpModifierData", "float", "scale[2]")) {
  89. +      for (Object *ob = bmain->objects.first; ob; ob = ob->id.next) {
  90. +        for (ModifierData *md = ob->modifiers.first; md; md = md->next) {
  91. +          if (md->type == eModifierType_UVWarp) {
  92. +            UVWarpModifierData *umd = (UVWarpModifierData *)md;
  93. +            copy_v2_fl(umd->scale, 1.0f);
  94. +          }
  95. +        }
  96. +      }
  97. +    }
  98.    }
  99.  }
  100. diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
  101. index 9db993cca59..4bbe18d4550 100644
  102. --- a/source/blender/makesdna/DNA_modifier_types.h
  103. +++ b/source/blender/makesdna/DNA_modifier_types.h
  104. @@ -1703,10 +1703,15 @@ typedef struct UVWarpModifierData {
  105.    ModifierData modifier;
  106.  
  107.    char axis_u, axis_v;
  108. -  char _pad[6];
  109. +  char source;
  110. +  char _pad;
  111.    /** Used for rotate/scale. */
  112.    float center[2];
  113.  
  114. +  float offset[2];
  115. +  float scale[2];
  116. +  float rotation;
  117. +
  118.    /** Source. */
  119.    struct Object *object_src;
  120.    /** Optional name of bone target, MAX_ID_NAME-2. */
  121. @@ -1722,6 +1727,11 @@ typedef struct UVWarpModifierData {
  122.    char uvlayer_name[64];
  123.  } UVWarpModifierData;
  124.  
  125. +enum {
  126. +  MOD_UVWARP_SOURCE_TRANSFORM = 0,
  127. +  MOD_UVWARP_SOURCE_FIXED = 1,
  128. +};
  129. +
  130.  /* cache modifier */
  131.  typedef struct MeshCacheModifierData {
  132.    ModifierData modifier;
  133. diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
  134. index 589ce1414bb..d6f969f35eb 100644
  135. --- a/source/blender/makesrna/intern/rna_modifier.c
  136. +++ b/source/blender/makesrna/intern/rna_modifier.c
  137. @@ -4539,6 +4539,16 @@ static void rna_def_modifier_screw(BlenderRNA *brna)
  138.  
  139.  static void rna_def_modifier_uvwarp(BlenderRNA *brna)
  140.  {
  141. +  static const EnumPropertyItem source_items[] = {
  142. +      {MOD_UVWARP_SOURCE_TRANSFORM, "TRANSFORM", 0, "Transform", "Get warp from transforms of two objects/bones"},
  143. +      {MOD_UVWARP_SOURCE_FIXED,
  144. +       "FIXED",
  145. +       0,
  146. +       "Fixed",
  147. +       "Get warp from fixed values in the modifier"},
  148. +      {0, NULL, 0, NULL, NULL},
  149. +  };
  150. +
  151.    StructRNA *srna;
  152.    PropertyRNA *prop;
  153.  
  154. @@ -4559,11 +4569,32 @@ static void rna_def_modifier_uvwarp(BlenderRNA *brna)
  155.    RNA_def_property_ui_text(prop, "V-Axis", "Pole axis for rotation");
  156.    RNA_def_property_update(prop, 0, "rna_Modifier_update");
  157.  
  158. +  prop = RNA_def_property(srna, "source", PROP_ENUM, PROP_NONE);
  159. +  RNA_def_property_enum_sdna(prop, NULL, "source");
  160. +  RNA_def_property_enum_items(prop, source_items);
  161. +  RNA_def_property_ui_text(prop, "Source", "Source for the warp");
  162. +  RNA_def_property_update(prop, 0, "rna_Modifier_update");
  163. +
  164.    prop = RNA_def_property(srna, "center", PROP_FLOAT, PROP_NONE);
  165.    RNA_def_property_float_sdna(prop, NULL, "center");
  166.    RNA_def_property_ui_text(prop, "UV Center", "Center point for rotate/scale");
  167.    RNA_def_property_update(prop, 0, "rna_Modifier_update");
  168.  
  169. +  prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE);
  170. +  RNA_def_property_float_sdna(prop, NULL, "offset");
  171. +  RNA_def_property_ui_text(prop, "Offset", "Offset");
  172. +  RNA_def_property_update(prop, 0, "rna_Modifier_update");
  173. +
  174. +  prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_NONE);
  175. +  RNA_def_property_float_sdna(prop, NULL, "scale");
  176. +  RNA_def_property_ui_text(prop, "Scale", "Scale");
  177. +  RNA_def_property_update(prop, 0, "rna_Modifier_update");
  178. +
  179. +  prop = RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_ANGLE);
  180. +  RNA_def_property_float_sdna(prop, NULL, "rotation");
  181. +  RNA_def_property_ui_text(prop, "Rotation", "Rotation");
  182. +  RNA_def_property_update(prop, 0, "rna_Modifier_update");
  183. +
  184.    prop = RNA_def_property(srna, "object_from", PROP_POINTER, PROP_NONE);
  185.    RNA_def_property_pointer_sdna(prop, NULL, "object_src");
  186.    RNA_def_property_ui_text(prop, "Object From", "Object defining offset");
  187. diff --git a/source/blender/modifiers/intern/MOD_uvwarp.c b/source/blender/modifiers/intern/MOD_uvwarp.c
  188. index 2c5f4b66c23..669eedc8bc0 100644
  189. --- a/source/blender/modifiers/intern/MOD_uvwarp.c
  190. +++ b/source/blender/modifiers/intern/MOD_uvwarp.c
  191. @@ -58,6 +58,7 @@ static void initData(ModifierData *md)
  192.    umd->axis_u = 0;
  193.    umd->axis_v = 1;
  194.    copy_v2_fl(umd->center, 0.5f);
  195. +  copy_v2_fl(umd->scale, 1.0f);
  196.  }
  197.  
  198.  static void requiredDataMask(Object *UNUSED(ob),
  199. @@ -145,38 +146,54 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
  200.    float mat_dst[4][4];
  201.    float imat_dst[4][4];
  202.    float warp_mat[4][4];
  203. -  const int axis_u = umd->axis_u;
  204. -  const int axis_v = umd->axis_v;
  205. +  int axis_u = umd->axis_u;
  206. +  int axis_v = umd->axis_v;
  207.  
  208.    /* make sure there are UV Maps available */
  209.    if (!CustomData_has_layer(&mesh->ldata, CD_MLOOPUV)) {
  210.      return mesh;
  211.    }
  212. -  else if (ELEM(NULL, umd->object_src, umd->object_dst)) {
  213. -    modifier_setError(md, "From/To objects must be set");
  214. -    return mesh;
  215. -  }
  216.  
  217. -  /* make sure anything moving UVs is available */
  218. -  matrix_from_obj_pchan(mat_src, umd->object_src, umd->bone_src);
  219. -  matrix_from_obj_pchan(mat_dst, umd->object_dst, umd->bone_dst);
  220.  
  221. -  invert_m4_m4(imat_dst, mat_dst);
  222. -  mul_m4_m4m4(warp_mat, imat_dst, mat_src);
  223. +  if (umd->source == MOD_UVWARP_SOURCE_TRANSFORM) {
  224. +    if (ELEM(NULL, umd->object_src, umd->object_dst)) {
  225. +      modifier_setError(md, "From/To objects must be set");
  226. +      return mesh;
  227. +    }
  228. +
  229. +    /* make sure anything moving UVs is available */
  230. +    matrix_from_obj_pchan(mat_src, umd->object_src, umd->bone_src);
  231. +    matrix_from_obj_pchan(mat_dst, umd->object_dst, umd->bone_dst);
  232. +
  233. +    invert_m4_m4(imat_dst, mat_dst);
  234. +    mul_m4_m4m4(warp_mat, imat_dst, mat_src);
  235.  
  236. -  /* apply warp */
  237. -  if (!is_zero_v2(umd->center)) {
  238. -    float mat_cent[4][4];
  239. -    float imat_cent[4][4];
  240. +    /* apply warp */
  241. +    if (!is_zero_v2(umd->center)) {
  242. +      float mat_cent[4][4];
  243. +      float imat_cent[4][4];
  244.  
  245. -    unit_m4(mat_cent);
  246. -    mat_cent[3][axis_u] = umd->center[0];
  247. -    mat_cent[3][axis_v] = umd->center[1];
  248. +      unit_m4(mat_cent);
  249. +      mat_cent[3][axis_u] = umd->center[0];
  250. +      mat_cent[3][axis_v] = umd->center[1];
  251.  
  252. -    invert_m4_m4(imat_cent, mat_cent);
  253. +      invert_m4_m4(imat_cent, mat_cent);
  254.  
  255. -    mul_m4_m4m4(warp_mat, warp_mat, imat_cent);
  256. -    mul_m4_m4m4(warp_mat, mat_cent, warp_mat);
  257. +      mul_m4_m4m4(warp_mat, warp_mat, imat_cent);
  258. +      mul_m4_m4m4(warp_mat, mat_cent, warp_mat);
  259. +    }
  260. +  }
  261. +  else {
  262. +    axis_u = 0;
  263. +    axis_v = 1;
  264. +
  265. +    unit_m4(warp_mat);
  266. +    translate_m4(warp_mat, umd->center[0], umd->center[1], 0.0f);
  267. +    const float scale[3] = {umd->scale[0], umd->scale[1], 1.0f};
  268. +    rescale_m4(warp_mat, scale);
  269. +    rotate_m4(warp_mat, 'Z', umd->rotation);
  270. +    translate_m4(warp_mat, umd->offset[0], umd->offset[1], 0.0f);
  271. +    translate_m4(warp_mat, -umd->center[0], -umd->center[1], 0.0f);
  272.    }
  273.  
  274.    /* make sure we're using an existing layer */
  275. @@ -239,8 +256,10 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
  276.  {
  277.    UVWarpModifierData *umd = (UVWarpModifierData *)md;
  278.  
  279. -  uv_warp_deps_object_bone_new(ctx->node, umd->object_src, umd->bone_src);
  280. -  uv_warp_deps_object_bone_new(ctx->node, umd->object_dst, umd->bone_dst);
  281. +  if (umd->source == MOD_UVWARP_SOURCE_TRANSFORM) {
  282. +    uv_warp_deps_object_bone_new(ctx->node, umd->object_src, umd->bone_src);
  283. +    uv_warp_deps_object_bone_new(ctx->node, umd->object_dst, umd->bone_dst);
  284. +  }
  285.  
  286.    DEG_add_modifier_to_transform_relation(ctx->node, "UVWarp Modifier");
  287.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement