Commit: 76291e4c92cf1335df6c2866902f97328c92e51d
Author: Antonio Vazquez
Date:   Sat Aug 1 19:11:13 2020 +0200
Branches: greasepencil-object
https://developer.blender.org/rB76291e4c92cf1335df6c2866902f97328c92e51d

GPencil: Use render size when export SVG in camera view

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

M       source/blender/editors/io/io_gpencil.c
M       source/blender/io/gpencil/gpencil_io_exporter.h
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/editors/io/io_gpencil.c 
b/source/blender/editors/io/io_gpencil.c
index 7aecfea7d44..a1de0f3d9d5 100644
--- a/source/blender/editors/io/io_gpencil.c
+++ b/source/blender/editors/io/io_gpencil.c
@@ -102,11 +102,29 @@ static ARegion *get_invoke_region(bContext *C)
   if (area == NULL) {
     return NULL;
   }
+
   ARegion *region = BKE_area_find_region_type(area, RGN_TYPE_WINDOW);
 
   return region;
 }
 
+static View3D *get_invoke_view3d(bContext *C)
+{
+  bScreen *screen = CTX_wm_screen(C);
+  if (screen == NULL) {
+    return NULL;
+  }
+  ScrArea *area = BKE_screen_find_big_area(screen, SPACE_VIEW3D, 0);
+  if (area == NULL) {
+    return NULL;
+  }
+  if (area) {
+    return area->spacedata.first;
+  }
+
+  return NULL;
+}
+
 static bool is_keyframe_empty(bGPdata *gpd, int framenum)
 {
   LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
@@ -142,6 +160,7 @@ static int wm_gpencil_export_exec(bContext *C, wmOperator 
*op)
     BKE_report(op->reports, RPT_ERROR, "Unable to find valid 3D View area");
     return OPERATOR_CANCELLED;
   }
+  View3D *v3d = get_invoke_view3d(C);
 
   char filename[FILE_MAX];
   RNA_string_get(op->ptr, "filepath", filename);
@@ -160,6 +179,7 @@ static int wm_gpencil_export_exec(bContext *C, wmOperator 
*op)
   struct GpencilExportParams params = {
       .C = C,
       .region = region,
+      .v3d = v3d,
       .obact = ob,
       .filename = filename,
       .mode = GP_EXPORT_TO_SVG,
diff --git a/source/blender/io/gpencil/gpencil_io_exporter.h 
b/source/blender/io/gpencil/gpencil_io_exporter.h
index b1c2af4d287..edfbbc57222 100644
--- a/source/blender/io/gpencil/gpencil_io_exporter.h
+++ b/source/blender/io/gpencil/gpencil_io_exporter.h
@@ -34,6 +34,7 @@ typedef enum eGpencilExport_Modes {
 struct GpencilExportParams {
   bContext *C;
   ARegion *region;
+  View3D *v3d;
   /** Grease pencil object. */
   struct Object *obact;
   /** Output filename.  */
diff --git a/source/blender/io/gpencil/intern/gpencil_io_base.cc 
b/source/blender/io/gpencil/intern/gpencil_io_base.cc
index f39c2c3efea..320bf18b294 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_base.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_base.cc
@@ -62,6 +62,7 @@ GpencilExporter::GpencilExporter(const struct 
GpencilExportParams *iparams)
   params_.frame_end = iparams->frame_end;
   params_.obact = iparams->obact;
   params_.region = iparams->region;
+  params_.v3d = iparams->v3d;
   params_.C = iparams->C;
   params_.filename = iparams->filename;
   params_.mode = iparams->mode;
@@ -73,8 +74,35 @@ GpencilExporter::GpencilExporter(const struct 
GpencilExportParams *iparams)
   rv3d = (RegionView3D *)params_.region->regiondata;
   gpd = (bGPdata *)params_.obact->data;
 
-  winx = params_.region->winx;
-  winy = params_.region->winy;
+  Scene *scene = CTX_data_scene(params_.C);
+  render_x_ = (scene->r.xsch * scene->r.size) / 100;
+  render_y_ = (scene->r.ysch * scene->r.size) / 100;
+
+  /* Camera rectangle. */
+  if (rv3d->persp == RV3D_CAMOB) {
+    ED_view3d_calc_camera_border(CTX_data_scene(params_.C),
+                                 depsgraph,
+                                 params_.region,
+                                 params_.v3d,
+                                 rv3d,
+                                 &camera_rect_,
+                                 true);
+    is_camera = true;
+    camera_ratio_ = render_x_ / (camera_rect_.xmax - camera_rect_.xmin);
+    offset_[0] = camera_rect_.xmin;
+    offset_[1] = camera_rect_.ymin;
+  }
+  else {
+    is_camera = false;
+    render_x_ = params_.region->winx;
+    render_y_ = params_.region->winy;
+    camera_ratio_ = 1.0f;
+    offset_[0] = 0.0f;
+    offset_[1] = 0.0f;
+  }
+
+  winx_ = params_.region->winx;
+  winy_ = params_.region->winy;
 
   /* Prepare output filename with full path. */
   set_out_filename(params_.filename);
@@ -138,12 +166,15 @@ bool 
GpencilExporter::gpencil_3d_point_to_screen_space(const float co[3], float
       copy_v2_v2(r_co, screen_co);
       /* Invert X axis. */
       if (invert_axis_[0]) {
-        r_co[0] = winx - r_co[0];
+        r_co[0] = winx_ - r_co[0];
       }
       /* Invert Y axis. */
       if (invert_axis_[1]) {
-        r_co[1] = winy - r_co[1];
+        r_co[1] = winy_ - r_co[1];
       }
+      /* Apply offset and scale. */
+      sub_v2_v2(r_co, offset_);
+      mul_v2_fl(r_co, camera_ratio_);
 
       return true;
     }
@@ -153,11 +184,11 @@ bool 
GpencilExporter::gpencil_3d_point_to_screen_space(const float co[3], float
 
   /* Invert X axis. */
   if (invert_axis_[0]) {
-    r_co[0] = winx - r_co[0];
+    r_co[0] = winx_ - r_co[0];
   }
   /* Invert Y axis. */
   if (invert_axis_[1]) {
-    r_co[1] = winy - r_co[1];
+    r_co[1] = winy_ - r_co[1];
   }
 
   return false;
@@ -352,4 +383,8 @@ float GpencilExporter::stroke_average_opacity(void)
   return avg_opacity;
 }
 
+bool GpencilExporter::is_camera_mode(void)
+{
+  return is_camera;
+}
 }  // namespace blender::io::gpencil
diff --git a/source/blender/io/gpencil/intern/gpencil_io_base.h 
b/source/blender/io/gpencil/intern/gpencil_io_base.h
index 141c0115df6..c0739af0aad 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_base.h
+++ b/source/blender/io/gpencil/intern/gpencil_io_base.h
@@ -75,7 +75,12 @@ class GpencilExporter {
   struct bGPdata *gpd;
   struct Main *bmain;
   struct RegionView3D *rv3d;
-  int winx, winy;
+
+  int winx_, winy_;
+  int render_x_, render_y_;
+  float camera_ratio_;
+  float offset_[2];
+  rctf camera_rect_;
 
   float stroke_color_[4], fill_color_[4];
 
@@ -86,6 +91,7 @@ class GpencilExporter {
   bool gp_style_is_stroke(void);
   bool gp_style_is_fill(void);
   float stroke_average_opacity(void);
+  bool is_camera_mode(void);
 
   void gpl_current_set(struct bGPDlayer *gpl);
   void gpf_current_set(struct bGPDframe *gpf);
@@ -99,6 +105,7 @@ class GpencilExporter {
   bool is_stroke;
   bool is_fill;
   float avg_opacity;
+  bool is_camera;
 
   void set_out_filename(char *filename);
 };
diff --git a/source/blender/io/gpencil/intern/gpencil_io_svg.cc 
b/source/blender/io/gpencil/intern/gpencil_io_svg.cc
index fafe8a1fe21..dfd3ad4b331 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_svg.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_svg.cc
@@ -38,6 +38,7 @@
 #include "DNA_material_types.h"
 #include "DNA_object_types.h"
 #include "DNA_screen_types.h"
+#include "DNA_view3d_types.h"
 
 #include "DEG_depsgraph.h"
 #include "DEG_depsgraph_query.h"
@@ -105,12 +106,35 @@ void GpencilExporterSVG::create_document_header(void)
   main_node.append_attribute("x").set_value("0px");
   main_node.append_attribute("y").set_value("0px");
 
-  std::string width = std::to_string(winx) + "px";
-  std::string height = std::to_string(winy) + "px";
-  main_node.append_attribute("width").set_value(width.c_str());
-  main_node.append_attribute("height").set_value(height.c_str());
-  std::string viewbox = "0 0 " + std::to_string(winx) + " " + 
std::to_string(winy);
-  main_node.append_attribute("viewBox").set_value(viewbox.c_str());
+  if (is_camera_mode()) {
+    std::string width = std::to_string(render_x_) + "px";
+    std::string height = std::to_string(render_y_) + "px";
+    main_node.append_attribute("width").set_value(width.c_str());
+    main_node.append_attribute("height").set_value(height.c_str());
+    std::string viewbox = "0 0 " + std::to_string(render_x_) + " " + 
std::to_string(render_y_);
+    main_node.append_attribute("viewBox").set_value(viewbox.c_str());
+
+    /* Camera border. */
+#if 0 /* TODO: Do we need camera border? */
+    pugi::xml_node cam_node = main_node.append_child("rect");
+    cam_node.append_attribute("stroke").set_value("#FF0000");
+    cam_node.append_attribute("stroke-width").set_value("10");
+    cam_node.append_attribute("stroke-opacity").set_value("0.5");
+    cam_node.append_attribute("fill").set_value("none");
+    cam_node.append_attribute("x").set_value(0);
+    cam_node.append_attribute("width").set_value((camera_rect_.xmax - 
camera_rect_.xmin) * camera_ratio_);
+    cam_node.append_attribute("y").set_value(0);
+    cam_node.append_attribute("height").set_value((camera_rect_.ymax - 
camera_rect_.ymin) * camera_ratio_);
+#endif
+  }
+  else {
+    std::string width = std::to_string(winx_) + "px";
+    std::string height = std::to_string(winy_) + "px";
+    main_node.append_attribute("width").set_value(width.c_str());
+    main_node.append_attribute("height").set_value(height.c_str());
+    std::string viewbox = "0 0 " + std::to_string(winx_) + " " + 
std::to_string(winy_);
+    main_node.append_attribute("viewBox").set_value(viewbox.c_str());
+  }
 }
 
 /* Main layer loop. */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to