Array Modifier: option to offset UV's
authorCampbell Barton <ideasman42@gmail.com>
Wed, 6 Dec 2017 17:33:52 +0000 (04:33 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 6 Dec 2017 17:33:52 +0000 (04:33 +1100)
D2912 by @Zuorion

release/scripts/startup/bl_ui/properties_data_modifier.py
source/blender/makesdna/DNA_modifier_types.h
source/blender/makesrna/intern/rna_modifier.c
source/blender/modifiers/intern/MOD_array.c

index 8f6e5f2df3937bdf66160917cee88c94bc20854a..7388dea215835a20648c3cd18fb05d7a31e4e771 100644 (file)
@@ -115,6 +115,13 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         sub.active = md.use_object_offset
         sub.prop(md, "offset_object", text="")
 
+        row = layout.row()
+        split = row.split()
+        col = split.column()
+        col.label(text="UVs:")
+        sub = col.column(align=True)
+        sub.prop(md, "offset_u")
+        sub.prop(md, "offset_v")
         layout.separator()
 
         layout.prop(md, "start_cap")
index 7f0547188e9ea32c0c7d32618d33496cd4076f70..fc0bf59518c76bd45404e57d66b9a17e256d4709 100644 (file)
@@ -249,6 +249,7 @@ typedef struct ArrayModifierData {
        int flags;
        /* the number of duplicates to generate for MOD_ARR_FIXEDCOUNT */
        int count;
+       float uv_offset[2];
 } ArrayModifierData;
 
 /* ArrayModifierData->fit_type */
index 62b917897ba2e6784db016ddc1695392913586ce..a99c9f9d89ea28ee1990b59049c173dd8befe150 100644 (file)
@@ -2122,6 +2122,20 @@ static void rna_def_modifier_array(BlenderRNA *brna)
        RNA_def_property_pointer_funcs(prop, NULL, "rna_ArrayModifier_end_cap_set", NULL, "rna_Mesh_object_poll");
        RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
        RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
+       
+       prop = RNA_def_property(srna, "offset_u", PROP_FLOAT, PROP_FACTOR);
+       RNA_def_property_float_sdna(prop, NULL, "uv_offset[0]");
+       RNA_def_property_range(prop, -1, 1);
+       RNA_def_property_ui_range(prop, -1, 1, 2, 4);
+       RNA_def_property_ui_text(prop, "U Offset", "Amount to offset array UVs on the U axis");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_property(srna, "offset_v", PROP_FLOAT, PROP_FACTOR);
+       RNA_def_property_float_sdna(prop, NULL, "uv_offset[1]");
+       RNA_def_property_range(prop, -1, 1);
+       RNA_def_property_ui_range(prop, -1, 1, 2, 4);
+       RNA_def_property_ui_text(prop, "V Offset", "Amount to offset array UVs on the V axis");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
 static void rna_def_modifier_edgesplit(BlenderRNA *brna)
index 874ac34b6135f8b974cc4a45dfca3f27b2791d4e..a3f3af0c748409c329aa3e8086ed1fbbc6060b4c 100644 (file)
@@ -655,6 +655,26 @@ static DerivedMesh *arrayModifier_doArray(
                }
        }
 
+       /* handle UVs */
+       if (chunk_nloops > 0 && is_zero_v2(amd->uv_offset) == false) {
+               const int totuv = CustomData_number_of_layers(&result->loopData, CD_MLOOPUV);
+               for (i = 0; i < totuv; i++) {
+                       MLoopUV *dmloopuv = CustomData_get_layer_n(&result->loopData, CD_MLOOPUV, i);
+                       dmloopuv += chunk_nloops;
+                       for (c = 1; c < count; c++) {
+                               const float uv_offset[2] = {
+                                       amd->uv_offset[0] * (float)c,
+                                       amd->uv_offset[1] * (float)c,
+                               };
+                               int l_index = chunk_nloops;
+                               for (; l_index-- != 0; dmloopuv++) {
+                                       dmloopuv->uv[0] += uv_offset[0];
+                                       dmloopuv->uv[1] += uv_offset[1];
+                               }
+                       }
+               }
+       }
+
        last_chunk_start = (count - 1) * chunk_nverts;
        last_chunk_nverts = chunk_nverts;