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