[Bf-blender-cvs] [3c316c91adf] greasepencil-object: GPencil: Add generic Y axis invert to main function

Antonio Vazquez noreply at git.blender.org
Mon Jul 27 23:24:34 CEST 2020


Commit: 3c316c91adf1f23ba8000d82df11c253ed0d9a66
Author: Antonio Vazquez
Date:   Mon Jul 27 23:24:24 2020 +0200
Branches: greasepencil-object
https://developer.blender.org/rB3c316c91adf1f23ba8000d82df11c253ed0d9a66

GPencil: Add generic Y axis invert to main function

This removes duplicate code

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

M	source/blender/io/gpencil/intern/gpencil_io_base.cc
M	source/blender/io/gpencil/intern/gpencil_io_base.h
M	source/blender/io/gpencil/intern/gpencil_io_svg.cc

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

diff --git a/source/blender/io/gpencil/intern/gpencil_io_base.cc b/source/blender/io/gpencil/intern/gpencil_io_base.cc
index 46cec62b923..fbd92632ae9 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_base.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_base.cc
@@ -76,21 +76,32 @@ void GpencilExporter::set_out_filename(struct bContext *C, char *filename)
 bool GpencilExporter::gpencil_3d_point_to_screen_space(struct ARegion *region,
                                                        const float diff_mat[4][4],
                                                        const float co[3],
+                                                       const bool invert,
                                                        float r_co[2])
 {
   float parent_co[3];
   mul_v3_m4v3(parent_co, diff_mat, co);
   float screen_co[2];
-  //  eV3DProjTest test = (eV3DProjTest)(V3D_PROJ_RET_CLIP_BB | V3D_PROJ_RET_CLIP_WIN);
   eV3DProjTest test = (eV3DProjTest)(V3D_PROJ_RET_OK);
   if (ED_view3d_project_float_global(region, parent_co, screen_co, test) == V3D_PROJ_RET_OK) {
     if (!ELEM(V2D_IS_CLIPPED, screen_co[0], screen_co[1])) {
       copy_v2_v2(r_co, screen_co);
+      /* Invert Y axis. */
+      if (invert) {
+        r_co[1] = params.region->winy - r_co[1];
+      }
+
       return true;
     }
   }
   r_co[0] = V2D_IS_CLIPPED;
   r_co[1] = V2D_IS_CLIPPED;
+
+  /* Invert Y axis. */
+  if (invert) {
+    r_co[1] = params.region->winy - r_co[1];
+  }
+
   return false;
 }
 
@@ -150,18 +161,14 @@ float GpencilExporter::stroke_point_radius_get(const struct bGPDlayer *gpl,
   float v1[2], screen_co[2], screen_ex[2];
 
   pt = &gps->points[0];
-  gpencil_3d_point_to_screen_space(params.region, diff_mat, &pt->x, screen_co);
-  /* Invert Y axis. */
-  screen_co[1] = params.region->winy - screen_co[1];
+  gpencil_3d_point_to_screen_space(params.region, diff_mat, &pt->x, true, screen_co);
 
   /* Radius. */
   bGPDstroke *gps_perimeter = BKE_gpencil_stroke_perimeter_from_view(
       rv3d, gpd, gpl, gps, 3, diff_mat);
 
   pt = &gps_perimeter->points[0];
-  gpencil_3d_point_to_screen_space(params.region, diff_mat, &pt->x, screen_ex);
-  /* Invert Y axis. */
-  screen_ex[1] = params.region->winy - screen_ex[1];
+  gpencil_3d_point_to_screen_space(params.region, diff_mat, &pt->x, true, screen_ex);
 
   sub_v2_v2v2(v1, screen_co, screen_ex);
   float radius = len_v2(v1);
diff --git a/source/blender/io/gpencil/intern/gpencil_io_base.h b/source/blender/io/gpencil/intern/gpencil_io_base.h
index 603f08901c9..2cadaf29429 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_base.h
+++ b/source/blender/io/gpencil/intern/gpencil_io_base.h
@@ -48,6 +48,7 @@ class GpencilExporter {
   bool gpencil_3d_point_to_screen_space(struct ARegion *region,
                                         const float diff_mat[4][4],
                                         const float co[3],
+                                        const bool invert,
                                         float r_co[2]);
 
   bool is_stroke_thickness_constant(struct bGPDstroke *gps);
diff --git a/source/blender/io/gpencil/intern/gpencil_io_svg.cc b/source/blender/io/gpencil/intern/gpencil_io_svg.cc
index b5ad18e840f..e2c35b694f6 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_svg.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_svg.cc
@@ -289,9 +289,7 @@ void GpencilExporterSVG::export_point(pugi::xml_node gpl_node,
       ("stylestroke" + std::to_string(gps->mat_nr + 1)).c_str());
 
   bGPDspoint *pt = &gps->points[0];
-  gpencil_3d_point_to_screen_space(params.region, diff_mat, &pt->x, screen_co);
-  /* Invert Y axis. */
-  screen_co[1] = params.region->winy - screen_co[1];
+  gpencil_3d_point_to_screen_space(params.region, diff_mat, &pt->x, true, screen_co);
 
   gps_node.append_attribute("cx").set_value(screen_co[0]);
   gps_node.append_attribute("cy").set_value(screen_co[1]);
@@ -328,9 +326,7 @@ void GpencilExporterSVG::export_stroke_path(pugi::xml_node gpl_node,
     }
     bGPDspoint *pt = &gps->points[i];
     float screen_co[2];
-    gpencil_3d_point_to_screen_space(params.region, diff_mat, &pt->x, screen_co);
-    /* Invert Y axis. */
-    screen_co[1] = params.region->winy - screen_co[1];
+    gpencil_3d_point_to_screen_space(params.region, diff_mat, &pt->x, true, screen_co);
     txt.append(std::to_string(screen_co[0]) + "," + std::to_string(screen_co[1]));
   }
   /* Close patch (cyclic)*/
@@ -403,9 +399,7 @@ void GpencilExporterSVG::export_stroke_polyline(pugi::xml_node gpl_node,
     }
     bGPDspoint *pt = &gps->points[i];
     float screen_co[2];
-    gpencil_3d_point_to_screen_space(params.region, diff_mat, &pt->x, screen_co);
-    /* Invert Y axis. */
-    screen_co[1] = params.region->winy - screen_co[1];
+    gpencil_3d_point_to_screen_space(params.region, diff_mat, &pt->x, true, screen_co);
     txt.append(std::to_string(screen_co[0]) + "," + std::to_string(screen_co[1]));
   }



More information about the Bf-blender-cvs mailing list