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