Commit: 4325cc63cc05eba810a5b1f8c24727cf31b73e08
Author: Antonio Vazquez
Date: Mon Aug 3 20:52:51 2020 +0200
Branches: greasepencil-object
https://developer.blender.org/rB4325cc63cc05eba810a5b1f8c24727cf31b73e08
GPencil: Fix problems with duplicated SVG frames
===================================================================
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/io/gpencil/intern/gpencil_io_base.h
b/source/blender/io/gpencil/intern/gpencil_io_base.h
index 0b684658914..6ced5c38c33 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_base.h
+++ b/source/blender/io/gpencil/intern/gpencil_io_base.h
@@ -44,12 +44,16 @@ class GpencilExporter {
public:
GpencilExporter(const struct GpencilExportParams *iparams);
- virtual bool write(std::string actual_frame, const bool newpage, const bool
savepage) = 0;
+ virtual bool write(std::string subfix,
+ const bool newpage,
+ const bool body,
+ const bool savepage) = 0;
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]);
+ void set_file_subfix(char *value);
protected:
bool invert_axis_[2];
diff --git a/source/blender/io/gpencil/intern/gpencil_io_capi.cc
b/source/blender/io/gpencil/intern/gpencil_io_capi.cc
index 8b70f81f8a7..77572d9156c 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_capi.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_capi.cc
@@ -62,6 +62,7 @@ static bool gpencil_io_export_frame(GpencilExporterSVG
*writter,
const GpencilExportParams *iparams,
float frame_offset[2],
const bool newpage,
+ const bool body,
const bool savepage)
{
@@ -70,7 +71,8 @@ static bool gpencil_io_export_frame(GpencilExporterSVG
*writter,
case GP_EXPORT_TO_SVG: {
writter->set_frame_number(iparams->framenum);
writter->set_frame_offset(frame_offset);
- result = writter->write(std::string(""), newpage, savepage);
+ std::string subfix = iparams->file_subfix;
+ result = writter->write(subfix, newpage, body, savepage);
break;
}
default:
@@ -80,80 +82,154 @@ static bool gpencil_io_export_frame(GpencilExporterSVG
*writter,
return result;
}
+static bool gpencil_create_page(
+ Depsgraph *depsgraph, Main *bmain, Scene *scene, GpencilExportParams
*iparams, int frame)
+{
+ GpencilExporterSVG writter = GpencilExporterSVG(iparams);
+ float no_offset[2] = {0.0f, 0.0f};
+ float ratio[2] = {1.0f, 1.0f};
+ writter.set_frame_ratio(ratio);
+
+ CFRA = frame;
+ BKE_scene_graph_update_for_newframe(depsgraph, bmain);
+ sprintf(iparams->file_subfix, "%04d", frame);
+ iparams->framenum = frame;
+
+ return gpencil_io_export_frame(&writter, iparams, no_offset, true, true,
true);
+}
+
+/* Export full animation. */
+static bool gpencil_export_animation(
+ Depsgraph *depsgraph, Main *bmain, Scene *scene, GpencilExportParams
*iparams, Object *ob)
+{
+ Object *ob_eval_ = (Object *)DEG_get_evaluated_id(depsgraph, &ob->id);
+ bGPdata *gpd_eval = (bGPdata *)ob_eval_->data;
+
+ bool done = false;
+ for (int i = iparams->frame_start; i < iparams->frame_end + 1; i++) {
+ if (is_keyframe_empty(gpd_eval, i)) {
+ continue;
+ }
+
+ done |= gpencil_create_page(depsgraph, bmain, scene, iparams, i);
+ }
+
+ return done;
+}
+
+/* Export full animation in Storyboard mode. */
+static bool gpencil_export_storyboard(
+ Depsgraph *depsgraph, Main *bmain, Scene *scene, GpencilExportParams
*iparams, Object *ob)
+{
+ Object *ob_eval_ = (Object *)DEG_get_evaluated_id(depsgraph, &ob->id);
+ bGPdata *gpd_eval = (bGPdata *)ob_eval_->data;
+ bool done = false;
+
+ GpencilExporterSVG *writter = new GpencilExporterSVG(iparams);
+
+ /* Calc paper sizes. */
+ const float blocks[2] = {3.0f, 2.0f};
+ float frame_box[2] = {iparams->paper_size[0] / (blocks[0] + 1.0f),
+ iparams->paper_size[1] / (blocks[0] + 1.0f)};
+ float render_ratio[2];
+ render_ratio[0] = frame_box[0] / ((scene->r.xsch * scene->r.size) / 100);
+ render_ratio[1] = frame_box[1] / ((scene->r.ysch * scene->r.size) / 100);
+
+ const float gap[2] = {frame_box[0] / (blocks[0] + 1.0f), frame_box[1] /
(blocks[1] + 1.0f)};
+ float frame_offset[2] = {gap[0], gap[1]};
+
+ int col = 1;
+ int row = 1;
+ int page = 1;
+ bool header = true;
+ bool pending_save = false;
+ for (int i = iparams->frame_start; i < iparams->frame_end + 1; i++) {
+ if (is_keyframe_empty(gpd_eval, i)) {
+ continue;
+ }
+
+ if (header) {
+ writter->set_frame_box(frame_box);
+ writter->set_frame_ratio(render_ratio);
+
+ pending_save |= gpencil_io_export_frame(writter, iparams, frame_offset,
true, false, false);
+ header = false;
+ }
+
+ CFRA = i;
+ BKE_scene_graph_update_for_newframe(depsgraph, bmain);
+ sprintf(iparams->file_subfix, "%04d", page);
+ iparams->framenum = i;
+
+ pending_save |= gpencil_io_export_frame(writter, iparams, frame_offset,
false, true, false);
+ col++;
+
+ if (col > blocks[0]) {
+ col = 1;
+ frame_offset[0] = gap[0];
+
+ row++;
+ frame_offset[1] += frame_box[1];
+ frame_offset[1] += gap[1];
+ }
+ else {
+ frame_offset[0] += frame_box[0];
+ frame_offset[0] += gap[0];
+ }
+
+ if (row > blocks[1]) {
+ done |= gpencil_io_export_frame(writter, iparams, frame_offset, false,
false, true);
+ page++;
+ header = true;
+ pending_save = false;
+ row = col = 1;
+ copy_v2_v2(frame_offset, gap);
+
+ /* Create a new class object per page. */
+ delete writter;
+ writter = new GpencilExporterSVG(iparams);
+ }
+ }
+
+ if (pending_save) {
+ done |= gpencil_io_export_frame(writter, iparams, frame_offset, false,
false, true);
+ }
+
+ delete writter;
+
+ return done;
+}
+
/* Main export entry point function. */
bool gpencil_io_export(GpencilExportParams *iparams)
{
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(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 = ((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] / (blocks[0] + 1.0f)};
- writter.set_frame_box(frame_box);
-
- const float gap[2] = {frame_box[0] / (blocks[0] + 1.0f), frame_box[1] /
(blocks[1] + 1.0f)};
-
- float frame_offset[2] = {gap[0], gap[1]};
-
if (only_active_frame) {
+ GpencilExporterSVG writter = GpencilExporterSVG(iparams);
float no_offset[2] = {0.0f, 0.0f};
float ratio[2] = {1.0f, 1.0f};
writter.set_frame_ratio(ratio);
- done |= gpencil_io_export_frame(&writter, iparams, no_offset, true, true);
+ done |= gpencil_io_export_frame(&writter, iparams, no_offset, true, true,
true);
}
else {
- bool newpage = true;
- bool savepage = false;
- float render_ratio[2];
- render_ratio[0] = frame_box[0] / ((scene->r.xsch * scene->r.size) / 100);
- render_ratio[1] = frame_box[1] / ((scene->r.ysch * scene->r.size) / 100);
- writter.set_frame_ratio(render_ratio);
-
- int x = 1;
- for (int i = iparams->frame_start; i < iparams->frame_end + 1; i++) {
- if (is_keyframe_empty(gpd_eval, i)) {
- continue;
- }
- if (x == 3) {
- savepage = true;
- }
-
- CFRA = i;
- BKE_scene_graph_update_for_newframe(depsgraph, bmain);
- sprintf(iparams->file_subfix, "%04d", i);
- iparams->framenum = i;
- done |= gpencil_io_export_frame(&writter, iparams, frame_offset,
newpage, savepage);
-
- if (x == 3) {
- savepage = true;
- newpage = false;
- x = 0;
- }
- else {
- newpage = false;
- x++;
- }
-
- frame_offset[0] += frame_box[0];
- frame_offset[0] += gap[0];
+ if ((iparams->flag & GP_EXPORT_STORYBOARD_MODE) != 0) {
+ done |= gpencil_export_storyboard(depsgraph, bmain, scene, iparams, ob);
+ }
+ else {
+ done |= gpencil_export_animation(depsgraph, bmain, scene, iparams, ob);
}
}
diff --git a/source/blender/io/gpencil/intern/gpencil_io_svg.cc
b/source/blender/io/gpencil/intern/gpencil_io_svg.cc
index 8900dc6b27a..915084e74e8 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_svg.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_svg.cc
@@ -69,22 +69,30 @@ GpencilExporterSVG::GpencilExporterSVG(const struct
GpencilExportParams *iparams
}
/* Main write method for SVG format. */
-bool GpencilExporterSVG::write(std::string actual_frame, const bool newpage,
const bool savepage)
+bool GpencilExporterSVG::write(std::string subfix,
+ const bool newpage,
+ const bool body,
+ const bool savepage)
{
+ /* Create new document and add header. */
if (newpage) {
create_document_header();
}
- export_layers();
-
- /* Add frame to filename. */
- std::string frame_file = out_filename_;
- size_t found = frame_file.find_last_of(".");
- if (found != std::string::npos) {
- frame_file.replace(found, 8, actual_frame + ".svg");
+ /* Add body. */
+ if (body) {
+ export_layers();
}
+ /* Save File. */
if (savepage) {
+ /* Add frame to filename. */
+ std::string frame_file = out_filename_;
+ size_t found = frame_file.find_last_of(".");
+ if (found != std::string::npos) {
+ frame_file.replace(found, 8, subfix + ".svg");
+ }
+
return doc.save_file(frame_file.c_str());
}
@@ -179,7 +187,7 @@ void GpencilExporterSVG::export_layers(void)
continue;
}
gpl_current_set(gpl);
- bGPDframe *gpf = gpl->actframe;
+ bGPDframe *gpf = BKE_gpencil_layer_frame_get(gpl, cfra_,
GP_GETFRAME_USE_PREV);
if ((gpf == NULL) || (gpf
@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs