[Bf-blender-cvs] [a4a7073f6c8] greasepencil-object: GPencil: New Tools for transforming UVs

Antonio Vazquez noreply at git.blender.org
Wed Oct 2 15:42:59 CEST 2019


Commit: a4a7073f6c878efeb604501a2682c72c8fc4bd21
Author: Antonio Vazquez
Date:   Tue Oct 1 13:42:22 2019 +0200
Branches: greasepencil-object
https://developer.blender.org/rBa4a7073f6c878efeb604501a2682c72c8fc4bd21

GPencil: New Tools for transforming UVs

The new tools are for translate, rotate and scale the UVs for any fill stroke using texture.

This was a missing option for UVs in grease pencil.

===================================================================

M	release/scripts/presets/keyconfig/keymap_data/blender_default.py
M	release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
M	source/blender/blenkernel/intern/gpencil.c
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/draw/engines/gpencil/gpencil_draw_utils.c
M	source/blender/editors/gpencil/CMakeLists.txt
M	source/blender/editors/gpencil/annotate_paint.c
M	source/blender/editors/gpencil/gpencil_intern.h
M	source/blender/editors/gpencil/gpencil_ops.c
M	source/blender/editors/gpencil/gpencil_primitive.c
A	source/blender/editors/gpencil/gpencil_uv.c
M	source/blender/editors/space_view3d/view3d_gizmo_ruler.c
M	source/blender/makesdna/DNA_gpencil_types.h
M	source/blender/makesrna/intern/rna_gpencil.c

===================================================================

diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index fafe950dfd8..0c726dca66d 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -5959,6 +5959,39 @@ def km_3d_view_tool_edit_gpencil_to_sphere(params):
     )
 
 
+def km_3d_view_tool_edit_gpencil_translate_uv(params):
+    return (
+        "3D View Tool: Edit Gpencil, Translate UV",
+        {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
+        {"items": [
+            ("gpencil.transform_uv", {"type": params.tool_tweak, "value": 'ANY'},
+             {"properties": [("mode", 'TRANSLATE'), ("release_confirm", True)]}),
+        ]},
+    )
+
+
+def km_3d_view_tool_edit_gpencil_rotate_uv(params):
+    return (
+        "3D View Tool: Edit Gpencil, Rotate UV",
+        {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
+        {"items": [
+            ("gpencil.transform_uv", {"type": params.tool_tweak, "value": 'ANY'},
+             {"properties": [("mode", 'ROTATE'), ("release_confirm", True)]}),
+        ]},
+    )
+
+
+def km_3d_view_tool_edit_gpencil_scale_uv(params):
+    return (
+        "3D View Tool: Edit Gpencil, Scale UV",
+        {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
+        {"items": [
+            ("gpencil.transform_uv", {"type": params.tool_tweak, "value": 'ANY'},
+             {"properties": [("mode", 'SCALE'), ("release_confirm", True)]}),
+        ]},
+    )
+
+
 # Also used for weight paint.
 def km_3d_view_tool_sculpt_gpencil_paint(_params):
     return (
@@ -6216,6 +6249,9 @@ def generate_keymaps(params=None):
         km_3d_view_tool_edit_gpencil_bend(params),
         km_3d_view_tool_edit_gpencil_shear(params),
         km_3d_view_tool_edit_gpencil_to_sphere(params),
+        km_3d_view_tool_edit_gpencil_translate_uv(params),
+        km_3d_view_tool_edit_gpencil_rotate_uv(params),
+        km_3d_view_tool_edit_gpencil_scale_uv(params),
         km_3d_view_tool_sculpt_gpencil_paint(params),
         km_3d_view_tool_sculpt_gpencil_select(params),
         km_3d_view_tool_sculpt_gpencil_select_box(params),
diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index aa5be13c01b..2ac2e256f74 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -1522,6 +1522,38 @@ class _defs_gpencil_edit:
             draw_settings=_template_widget.VIEW3D_GGT_xform_extrude.draw_settings,
         )
 
+    @ToolDef.from_fn
+    def transform_uv_translate():
+        return dict(
+            idname="builtin.translate_uv",
+            label="Translate UV",
+            icon="ops.gpencil.translate_uv",
+            cursor='DEFAULT',
+            widget=None,
+            keymap=(),
+        )
+
+    @ToolDef.from_fn
+    def transform_uv_rotate():
+        return dict(
+            idname="builtin.rotate_uv",
+            label="Rotate UV",
+            icon="ops.gpencil.rotate_uv",
+            cursor='DEFAULT',
+            widget=None,
+            keymap=(),
+        )
+
+    @ToolDef.from_fn
+    def transform_uv_scale():
+        return dict(
+            idname="builtin.scale_uv",
+            label="Scale UV",
+            icon="ops.gpencil.scale_uv",
+            cursor='DEFAULT',
+            widget=None,
+            keymap=(),
+        )
 
 class _defs_gpencil_sculpt:
 
@@ -2063,7 +2095,10 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel):
                 _defs_gpencil_edit.shear,
                 _defs_gpencil_edit.tosphere,
             ),
-
+            None,
+            _defs_gpencil_edit.transform_uv_translate,
+            _defs_gpencil_edit.transform_uv_rotate,
+            _defs_gpencil_edit.transform_uv_scale,
         ],
         'SCULPT_GPENCIL': [
             _defs_gpencil_sculpt.generate_from_brushes,
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index f78833a0ebe..26fa7c5058c 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -484,6 +484,8 @@ bGPDstroke *BKE_gpencil_add_stroke(bGPDframe *gpf, int mat_idx, int totpoints, s
   gps->gradient_s[0] = 1.0f;
   gps->gradient_s[1] = 1.0f;
 
+  gps->uv_scale = 1.0f;
+
   gps->inittime = 0;
 
   /* enable recalculation flag by default */
@@ -2739,6 +2741,8 @@ static void gpencil_convert_spline(Main *bmain,
   bGPDstroke *gps = MEM_callocN(sizeof(bGPDstroke), "bGPDstroke");
   gps->thickness = 1.0f;
   gps->gradient_f = 1.0f;
+  gps->uv_scale = 1.0f;
+
   ARRAY_SET_ITEMS(gps->gradient_s, 1.0f, 1.0f);
   ARRAY_SET_ITEMS(gps->caps, GP_STROKE_CAP_ROUND, GP_STROKE_CAP_ROUND);
   gps->inittime = 0.0f;
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 7ea1d25f86d..c8d0ea0c01b 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -3857,7 +3857,6 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
       }
     }
 
-    /* Fix wrong 3D viewport copying causing corrupt pointers (T69974). */
     for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) {
       for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
         for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
@@ -3902,5 +3901,20 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
         }
       }
     }
+
+    {
+      /* Fix new grease pencil uv scale. */
+      if (!DNA_struct_elem_find(fd->filesdna, "bGPDstroke", "float", "uv_scale")) {
+        for (bGPdata *gpd = bmain->gpencils.first; gpd; gpd = gpd->id.next) {
+          for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
+            for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) {
+              for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
+                gps->uv_scale = 1.0f;
+              }
+            }
+          }
+        }
+      }
+    }
   }
 }
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
index ce5d8cbf732..7dc5c164ccb 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
@@ -308,17 +308,43 @@ static void gpencil_calc_2d_bounding_box(const float (*points2d)[2],
 
 /* calc texture coordinates using flat projected points */
 static void gpencil_calc_stroke_fill_uv(const float (*points2d)[2],
-                                        int totpoints,
+                                        bGPDstroke *gps,
                                         const float minv[2],
                                         float maxv[2],
                                         float (*r_uv)[2])
 {
+  const float s = sin(gps->uv_rotation);
+  const float c = cos(gps->uv_rotation);
+
+  /* Calc center for rotation. */
+  float center[2] = {0.5f, 0.5f};
+  //  sub_v2_v2v2(center, maxv, minv);
+  // mul_v2_fl(center, 0.5f);
+
   float d[2];
   d[0] = maxv[0] - minv[0];
   d[1] = maxv[1] - minv[1];
-  for (int i = 0; i < totpoints; i++) {
+  for (int i = 0; i < gps->totpoints; i++) {
     r_uv[i][0] = (points2d[i][0] - minv[0]) / d[0];
     r_uv[i][1] = (points2d[i][1] - minv[1]) / d[1];
+
+    /* Apply translation. */
+    add_v2_v2(r_uv[i], gps->uv_translation);
+
+    /* Apply Rotation. */
+    r_uv[i][0] -= center[0];
+    r_uv[i][1] -= center[1];
+
+    float x = r_uv[i][0] * c - r_uv[i][1] * s;
+    float y = r_uv[i][0] * s + r_uv[i][1] * c;
+
+    r_uv[i][0] = x + center[0];
+    r_uv[i][1] = y + center[1];
+
+    /* Apply scale. */
+    if (gps->uv_scale != 0.0f) {
+      mul_v2_fl(r_uv[i], 1.0f / gps->uv_scale);
+    }
   }
 }
 
@@ -1525,7 +1551,7 @@ void gpencil_triangulate_stroke_fill(Object *ob, bGPDstroke *gps)
   }
 
   /* calc uv data */
-  gpencil_calc_stroke_fill_uv(points2d, gps->totpoints, minv, maxv, uv);
+  gpencil_calc_stroke_fill_uv(points2d, gps, minv, maxv, uv);
 
   /* Number of triangles */
   gps->tot_triangles = gps->totpoints - 2;
diff --git a/source/blender/editors/gpencil/CMakeLists.txt b/source/blender/editors/gpencil/CMakeLists.txt
index 21f1801f7eb..0ba081de8ca 100644
--- a/source/blender/editors/gpencil/CMakeLists.txt
+++ b/source/blender/editors/gpencil/CMakeLists.txt
@@ -57,6 +57,7 @@ set(SRC
   gpencil_select.c
   gpencil_undo.c
   gpencil_utils.c
+  gpencil_uv.c
 
   gpencil_intern.h
 )
diff --git a/source/blender/editors/gpencil/annotate_paint.c b/source/blender/editors/gpencil/annotate_paint.c
index 7a10547f35c..c19a9276d01 100644
--- a/source/blender/editors/gpencil/annotate_paint.c
+++ b/source/blender/editors/gpencil/annotate_paint.c
@@ -614,6 +614,7 @@ static void gp_stroke_newfrombuffer(tGPsdata *p)
   gps->gradient_f = 1.0f;
   gps->gradient_s[0] = 1.0f;
   gps->gradient_s[1] = 1.0f;
+  gps->uv_scale = 1.0f;
   gps->flag = gpd->runtime.sbuffer_sflag;
   gps->inittime = p->inittime;
 
diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h
index a8f8ec0e8c5..be526186709 100644
--- a/source/blender/editors/gpencil/gpencil_intern.h
+++ b/source/blender/editors/gpencil/gpencil_intern.h
@@ -492,6 +492,8 @@ void GPENCIL_OT_stroke_cutter(struct wmOperatorType *ot);
 void GPENCIL_OT_stroke_trim(struct wmOperatorType *ot);
 void GPENCIL_OT_stroke_merge_by_distance(struct wmOperatorType *ot);
 
+void GPENCIL_OT_transform_uv(struct wmOperatorType *ot);
+
 void GPENCIL_OT_brush_presets_create(struct wmOperatorType *ot);
 
 /* undo stack ---------- */
diff --git a/source/blender/editors/gpencil/gpencil_ops.c b/source/blender/editors/gpencil/gpencil_ops.c
index ce410f3e52d..6c960bd46e7 100644
--- a/source/blender/editors/gpencil/gpencil_ops.c
+++ b/source/blender/editors/gpencil/gpencil_ops.c
@@ -322,6 +322,8 @@ void ED_operatortypes_gpencil(void)
   WM_operatortype_append(GPENCIL_OT_stroke_trim);
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list