[Bf-blender-cvs] [e8e8f27b155] temp-gpencil-io: GPencil: First steps to prepare export in camera view

Antonio Vazquez noreply at git.blender.org
Tue Jan 19 19:19:17 CET 2021


Commit: e8e8f27b1558f4abb04983dea99acca361874a7f
Author: Antonio Vazquez
Date:   Tue Jan 19 19:19:12 2021 +0100
Branches: temp-gpencil-io
https://developer.blender.org/rBe8e8f27b1558f4abb04983dea99acca361874a7f

GPencil: First steps to prepare export in camera view

This is the initial work to keep camera size independent of viewport zoom level.

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

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_export_pdf.cc
M	source/blender/io/gpencil/intern/gpencil_io_export_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 fe50459c470..8c4dcee42a8 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_base.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_base.cc
@@ -234,6 +234,42 @@ bool GpencilIO::gpencil_3d_point_to_screen_space(const float co[3], float r_co[2
   return false;
 }
 
+/**
+ * Convert to project space
+ * \param co: 3D position
+ * \param r_co: 2D position
+ */
+void GpencilIO::gpencil_3d_point_to_project_space(const float mat[4][4],
+                                                  const float co[3],
+                                                  float r_co[2])
+{
+  float parent_co[3];
+  mul_v3_m4v3(parent_co, diff_mat_, co);
+
+  float tmp[4];
+  copy_v3_v3(tmp, parent_co);
+  tmp[3] = 1.0f;
+  mul_m4_v4(mat, tmp);
+
+  copy_v2_v2(r_co, tmp);
+}
+
+/**
+ * Convert to 2D
+ * \param co: 3D position
+ * \param r_co: 2D position
+ */
+void GpencilIO::gpencil_3d_point_to_2D(const float co[3], float r_co[2])
+{
+  const bool is_camera = (bool)(rv3d_->persp == RV3D_CAMOB);
+  if (is_camera) {
+    gpencil_3d_point_to_project_space(rv3d_->viewmat, co, r_co);
+  }
+  else {
+    gpencil_3d_point_to_screen_space(co, r_co);
+  }
+}
+
 /**
  * Get average pressure
  * \param gps: Pointer to stroke
@@ -293,14 +329,14 @@ float GpencilIO::stroke_point_radius_get(struct bGPDstroke *gps)
   float v1[2], screen_co[2], screen_ex[2];
 
   pt = &gps->points[0];
-  gpencil_3d_point_to_screen_space(&pt->x, screen_co);
+  gpencil_3d_point_to_2D(&pt->x, 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(&pt->x, screen_ex);
+  gpencil_3d_point_to_2D(&pt->x, screen_ex);
 
   sub_v2_v2v2(v1, screen_co, screen_ex);
   float radius = len_v2(v1);
@@ -478,7 +514,7 @@ void GpencilIO::selected_objects_boundbox_set(void)
         }
         for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
           /* Convert to 2D. */
-          gpencil_3d_point_to_screen_space(&pt->x, screen_co);
+          gpencil_3d_point_to_2D(&pt->x, screen_co);
           minmax_v2v2_v2(r_min, r_max, screen_co);
         }
       }
diff --git a/source/blender/io/gpencil/intern/gpencil_io_base.h b/source/blender/io/gpencil/intern/gpencil_io_base.h
index 988a184fe58..ac11a7132d9 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_base.h
+++ b/source/blender/io/gpencil/intern/gpencil_io_base.h
@@ -91,6 +91,8 @@ class GpencilIO {
 
   /* Geometry functions. */
   bool gpencil_3d_point_to_screen_space(const float co[3], float r_co[2]);
+  void gpencil_3d_point_to_project_space(const float mat[4][4], const float co[3], float r_co[2]);
+  void gpencil_3d_point_to_2D(const float co[3], float r_co[2]);
 
   float stroke_point_radius_get(struct bGPDstroke *gps);
   void create_object_list(void);
diff --git a/source/blender/io/gpencil/intern/gpencil_io_export_pdf.cc b/source/blender/io/gpencil/intern/gpencil_io_export_pdf.cc
index 7215f7e1965..816522967b9 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_export_pdf.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_export_pdf.cc
@@ -241,7 +241,7 @@ void GpencilExporterPDF::export_stroke_to_point(void)
   float screen_co[2];
 
   bGPDspoint *pt = &gps->points[0];
-  gpencil_3d_point_to_screen_space(&pt->x, screen_co);
+  gpencil_3d_point_to_2D(&pt->x, screen_co);
   /* Radius. */
   float radius = stroke_point_radius_get(gps);
 
@@ -292,13 +292,12 @@ void GpencilExporterPDF::export_stroke_to_polyline(const bool do_fill, const boo
     pt = &gps->points[i];
     float screen_co[2];
     HPDF_STATUS err;
-    if (gpencil_3d_point_to_screen_space(&pt->x, screen_co)) {
-      if (i == 0) {
-        err = HPDF_Page_MoveTo(page_, screen_co[0], render_y_ - screen_co[1]);
-      }
-      else {
-        err = HPDF_Page_LineTo(page_, screen_co[0], render_y_ - screen_co[1]);
-      }
+    gpencil_3d_point_to_2D(&pt->x, screen_co);
+    if (i == 0) {
+      err = HPDF_Page_MoveTo(page_, screen_co[0], render_y_ - screen_co[1]);
+    }
+    else {
+      err = HPDF_Page_LineTo(page_, screen_co[0], render_y_ - screen_co[1]);
     }
   }
   if (do_fill || !normalize) {
diff --git a/source/blender/io/gpencil/intern/gpencil_io_export_svg.cc b/source/blender/io/gpencil/intern/gpencil_io_export_svg.cc
index d19d0668028..b00eafe740d 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_export_svg.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_export_svg.cc
@@ -282,7 +282,7 @@ void GpencilExporterSVG::export_stroke_to_point(pugi::xml_node gpl_node)
   color_string_set(gps_node, false);
 
   bGPDspoint *pt = &gps->points[0];
-  gpencil_3d_point_to_screen_space(&pt->x, screen_co);
+  gpencil_3d_point_to_2D(&pt->x, screen_co);
 
   gps_node.append_attribute("cx").set_value(screen_co[0]);
   gps_node.append_attribute("cy").set_value(screen_co[1]);
@@ -331,7 +331,7 @@ void GpencilExporterSVG::export_stroke_to_path(pugi::xml_node gpl_node, const bo
     }
     bGPDspoint *pt = &gps->points[i];
     float screen_co[2];
-    gpencil_3d_point_to_screen_space(&pt->x, screen_co);
+    gpencil_3d_point_to_2D(&pt->x, screen_co);
     txt.append(std::to_string(screen_co[0]) + "," + std::to_string(screen_co[1]));
   }
   /* Close patch (cyclic)*/
@@ -389,7 +389,7 @@ void GpencilExporterSVG::export_stroke_to_polyline(pugi::xml_node gpl_node, cons
     }
     pt = &gps->points[i];
     float screen_co[2];
-    gpencil_3d_point_to_screen_space(&pt->x, screen_co);
+    gpencil_3d_point_to_2D(&pt->x, 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