Commit: 8f601a35131658c2f9ad943730f4e3dabd41ab05
Author: Antonio Vazquez
Date:   Mon Aug 3 17:35:32 2020 +0200
Branches: greasepencil-object
https://developer.blender.org/rB8f601a35131658c2f9ad943730f4e3dabd41ab05

GPencil: More work to export animations to SVG

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

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_capi.cc
M       source/blender/io/gpencil/intern/gpencil_io_svg.cc
M       source/blender/io/gpencil/intern/gpencil_io_svg.h

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

diff --git a/source/blender/editors/io/io_gpencil.c 
b/source/blender/editors/io/io_gpencil.c
index b870e2f9db7..8825cb56634 100644
--- a/source/blender/editors/io/io_gpencil.c
+++ b/source/blender/editors/io/io_gpencil.c
@@ -152,6 +152,7 @@ static int wm_gpencil_export_exec(bContext *C, wmOperator 
*op)
   const bool use_selected_objects = RNA_boolean_get(op->ptr, 
"use_selected_objects");
   const bool use_clip_camera = RNA_boolean_get(op->ptr, "use_clip_camera");
   const bool use_gray_scale = RNA_boolean_get(op->ptr, "use_gray_scale");
+  const bool use_storyboard = RNA_boolean_get(op->ptr, "use_storyboard");
 
   /* Set flags. */
   int flag = 0;
@@ -161,6 +162,8 @@ static int wm_gpencil_export_exec(bContext *C, wmOperator 
*op)
   SET_FLAG_FROM_TEST(flag, use_selected_objects, GP_EXPORT_SELECTED_OBJECTS);
   SET_FLAG_FROM_TEST(flag, use_clip_camera, GP_EXPORT_CLIP_CAMERA);
   SET_FLAG_FROM_TEST(flag, use_gray_scale, GP_EXPORT_GRAY_SCALE);
+  SET_FLAG_FROM_TEST(flag, use_storyboard, GP_EXPORT_STORYBOARD_MODE);
+
   struct GpencilExportParams params = {
       .C = C,
       .region = region,
@@ -222,6 +225,7 @@ static void ui_gpencil_export_settings(uiLayout *layout, 
PointerRNA *imfptr)
   uiLayoutSetActive(sub, !RNA_boolean_get(imfptr, "only_active_frame"));
   uiItemR(sub, imfptr, "start", 0, IFACE_("Frame Start"), ICON_NONE);
   uiItemR(sub, imfptr, "end", 0, IFACE_("End"), ICON_NONE);
+  uiItemR(sub, imfptr, "use_storyboard", 0, NULL, ICON_NONE);
 
   box = uiLayoutBox(layout);
   row = uiLayoutRow(box, false);
@@ -356,6 +360,8 @@ void WM_OT_gpencil_export(wmOperatorType *ot)
                   false,
                   "Gray Scale",
                   "Export in gray scale instead of full color");
+  RNA_def_boolean(
+      ot->srna, "use_storyboard", false, "Storyboard Mode", "Export several 
frame sin same page");
   RNA_def_float(ot->srna,
                 "stroke_sample",
                 0.03f,
diff --git a/source/blender/io/gpencil/gpencil_io_exporter.h 
b/source/blender/io/gpencil/gpencil_io_exporter.h
index 8a926506be5..b79735792db 100644
--- a/source/blender/io/gpencil/gpencil_io_exporter.h
+++ b/source/blender/io/gpencil/gpencil_io_exporter.h
@@ -27,6 +27,9 @@ struct Scene;
 struct bContext;
 struct ARegion;
 
+/* Paper Size: A4, Letter. */
+static const float paper_size[2][2] = {3508, 2480, 3300, 2550};
+
 typedef enum eGpencilExport_Modes {
   GP_EXPORT_TO_SVG = 0,
 } eGpencilExport_Modes;
@@ -46,13 +49,17 @@ struct GpencilExportParams {
   /** End frame.  */
   double frame_end;
   /** Frame subfix. */
-  char frame[5];
+  char file_subfix[5];
   /* Current frame. */
-  int cfra;
+  int framenum;
   /** Flags. */
   int flag;
   /** Stroke sampling. */
   float stroke_sample;
+  /** Row and cols of storyboard. */
+  int story_size[2];
+  /** Paper size in pixels. */
+  float paper_size[2];
 };
 
 typedef enum eGpencilExportParams_Flag {
@@ -68,9 +75,11 @@ typedef enum eGpencilExportParams_Flag {
   GP_EXPORT_CLIP_CAMERA = (1 << 4),
   /* Gray Scale. */
   GP_EXPORT_GRAY_SCALE = (1 << 5),
+  /* Use Storyboard format. */
+  GP_EXPORT_STORYBOARD_MODE = (1 << 6),
 } eGpencilExportParams_Flag;
 
-bool gpencil_io_export(struct GpencilExportParams *params);
+bool gpencil_io_export(struct GpencilExportParams *iparams);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/io/gpencil/intern/gpencil_io_base.cc 
b/source/blender/io/gpencil/intern/gpencil_io_base.cc
index adbeb32aa20..2aba9f7a9d6 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_base.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_base.cc
@@ -1,3 +1,5 @@
+
+
 /*
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -71,7 +73,10 @@ GpencilExporter::GpencilExporter(const struct 
GpencilExportParams *iparams)
   params_.mode = iparams->mode;
   params_.flag = iparams->flag;
   params_.stroke_sample = iparams->stroke_sample;
-  params_.cfra = iparams->cfra;
+  params_.framenum = iparams->framenum;
+
+  copy_v2_v2_int(params_.story_size, iparams->story_size);
+  copy_v2_v2(params_.paper_size, iparams->paper_size);
 
   /* Easy access data. */
   bmain = CTX_data_main(params_.C);
@@ -191,8 +196,7 @@ void GpencilExporter::set_out_filename(char *filename)
   //#endif
 }
 
-/* Convert to screen space.
- * TODO: Cleanup using a more generic BKE function.?? */
+/* Convert to screen space. */
 bool GpencilExporter::gpencil_3d_point_to_screen_space(const float co[3], 
float r_co[2])
 {
   float parent_co[3];
@@ -215,6 +219,10 @@ bool 
GpencilExporter::gpencil_3d_point_to_screen_space(const float co[3], float
       sub_v2_v2(r_co, offset_);
       mul_v2_fl(r_co, camera_ratio_);
 
+      /* Apply frame offset and scale. */
+      mul_v2_v2(r_co, frame_ratio_);
+      add_v2_v2(r_co, frame_offset_);
+
       return true;
     }
   }
@@ -496,4 +504,24 @@ void GpencilExporter::get_select_boundbox(rctf *boundbox)
   boundbox->ymax = select_box.ymax;
 }
 
+void GpencilExporter::set_frame_number(int value)
+{
+  cfra_ = value;
+}
+
+void GpencilExporter::set_frame_offset(float value[2])
+{
+  copy_v2_v2(frame_offset_, value);
+}
+
+void GpencilExporter::set_frame_ratio(float value[2])
+{
+  copy_v2_v2(frame_ratio_, value);
+}
+
+void GpencilExporter::set_frame_box(float value[2])
+{
+  copy_v2_v2(frame_box_, value);
+}
+
 }  // 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 0f2d23886db..0b684658914 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_base.h
+++ b/source/blender/io/gpencil/intern/gpencil_io_base.h
@@ -44,19 +44,12 @@ class GpencilExporter {
 
  public:
   GpencilExporter(const struct GpencilExportParams *iparams);
-  virtual bool write(std::string actual_frame) = 0;
+  virtual bool write(std::string actual_frame, const bool newpage, const bool 
savepage) = 0;
 
-  /* Geometry functions. */
-  bool gpencil_3d_point_to_screen_space(const float co[3], float r_co[2]);
-
-  bool is_stroke_thickness_constant(struct bGPDstroke *gps);
-  float stroke_average_pressure_get(struct bGPDstroke *gps);
-  float stroke_point_radius_get(struct bGPDstroke *gps);
-  void selected_objects_boundbox(void);
-
-  std::string rgb_to_hex(float color[3]);
-  void rgb_to_grayscale(float color[3]);
-  std::string to_lower_string(char *input_text);
+  void set_frame_number(int value);
+  void set_frame_offset(float value[2]);
+  void set_frame_ratio(float value[2]);
+  void set_frame_box(float value[2]);
 
  protected:
   bool invert_axis_[2];
@@ -83,10 +76,25 @@ class GpencilExporter {
   float camera_ratio_;
   float offset_[2];
   rctf camera_rect_;
+  float frame_box_[2];
+  float frame_offset_[2];
+  float frame_ratio_[2];
   int cfra_;
 
   float stroke_color_[4], fill_color_[4];
 
+  /* Geometry functions. */
+  bool gpencil_3d_point_to_screen_space(const float co[3], float r_co[2]);
+
+  bool is_stroke_thickness_constant(struct bGPDstroke *gps);
+  float stroke_average_pressure_get(struct bGPDstroke *gps);
+  float stroke_point_radius_get(struct bGPDstroke *gps);
+  void selected_objects_boundbox(void);
+
+  std::string rgb_to_hex(float color[3]);
+  void rgb_to_grayscale(float color[3]);
+  std::string to_lower_string(char *input_text);
+
   struct bGPDlayer *gpl_current_get(void);
   struct bGPDframe *gpf_current_get(void);
   struct bGPDstroke *gps_current_get(void);
diff --git a/source/blender/io/gpencil/intern/gpencil_io_capi.cc 
b/source/blender/io/gpencil/intern/gpencil_io_capi.cc
index 499e607c753..8b70f81f8a7 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_capi.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_capi.cc
@@ -21,6 +21,7 @@
 #include <stdio.h>
 
 #include "BLI_listbase.h"
+#include "BLI_math.h"
 #include "BLI_path_util.h"
 #include "BLI_string.h"
 #include "BLI_utildefines.h"
@@ -57,14 +58,19 @@ static bool is_keyframe_empty(bGPdata *gpd, int framenum)
 }
 
 /* Export current frame. */
-static bool gpencil_io_export_frame(const GpencilExportParams *params)
+static bool gpencil_io_export_frame(GpencilExporterSVG *writter,
+                                    const GpencilExportParams *iparams,
+                                    float frame_offset[2],
+                                    const bool newpage,
+                                    const bool savepage)
 {
 
   bool result = false;
-  switch (params->mode) {
+  switch (iparams->mode) {
     case GP_EXPORT_TO_SVG: {
-      GpencilExporterSVG writter = GpencilExporterSVG(params);
-      result = writter.write(std::string(params->frame));
+      writter->set_frame_number(iparams->framenum);
+      writter->set_frame_offset(frame_offset);
+      result = writter->write(std::string(""), newpage, savepage);
       break;
     }
     default:
@@ -75,35 +81,79 @@ static bool gpencil_io_export_frame(const 
GpencilExportParams *params)
 }
 
 /* Main export entry point function. */
-bool gpencil_io_export(GpencilExportParams *params)
+bool gpencil_io_export(GpencilExportParams *iparams)
 {
-  Main *bmain = CTX_data_main(params->C);
-  Depsgraph *depsgraph = CTX_data_depsgraph_pointer(params->C);
-  Scene *scene = CTX_data_scene(params->C);
+  Main *bmain = CTX_data_main(iparams->C);
+  Depsgraph *depsgraph = CTX_data_depsgraph_pointer(iparams->C);
+  Scene *scene = CTX_data_scene(iparams->C);
 
-  Object *ob = CTX_data_active_object(params->C);
+  Object *ob = CTX_data_active_object(iparams->C);
   Object *ob_eval_ = (Object *)DEG_get_evaluated_id(depsgraph, &ob->id);
   bGPdata *gpd_eval = (bGPdata *)ob_eval_->data;
 
-  const bool only_active_frame = ((params->flag & GP_EXPORT_ACTIVE_FRAME) != 
0);
+  const bool only_active_frame = ((iparams->flag & GP_EXPORT_ACTIVE_FRAME) != 
0);
 
   int oldframe = (int)DEG_get_ctime(depsgraph);
   bool done = false;
 
+  /* Calc paper sizes. */
+  const float blocks[2] = {3.0f, 1.0f};
+
+  /* Prepare document. */
+  // TODO: Fix paper using parameter
+  copy_v2_v2(iparams->paper_size, paper_size[0]);
+
+  GpencilExporterSVG writter = GpencilExporterSVG(iparams);
+
+  float frame_box[2] = {iparams->paper_size[0] / (blocks[0] + 1.0f),
+                        iparams->paper_size[1] / (block

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to