[Bf-blender-cvs] [e8e8f27b155] temp-gpencil-io: GPencil: First steps to prepare export in camera view
Antonio Vazquez
noreply at git.blender.org
Tue Jan 19 19:19:17 CET 2021
Commit: e8e8f27b1558f4abb04983dea99acca361874a7f
Author: Antonio Vazquez
Date: Tue Jan 19 19:19:12 2021 +0100
Branches: temp-gpencil-io
https://developer.blender.org/rBe8e8f27b1558f4abb04983dea99acca361874a7f
GPencil: First steps to prepare export in camera view
This is the initial work to keep camera size independent of viewport zoom level.
===================================================================
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_export_pdf.cc
M source/blender/io/gpencil/intern/gpencil_io_export_svg.cc
===================================================================
diff --git a/source/blender/io/gpencil/intern/gpencil_io_base.cc b/source/blender/io/gpencil/intern/gpencil_io_base.cc
index fe50459c470..8c4dcee42a8 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_base.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_base.cc
@@ -234,6 +234,42 @@ bool GpencilIO::gpencil_3d_point_to_screen_space(const float co[3], float r_co[2
return false;
}
+/**
+ * Convert to project space
+ * \param co: 3D position
+ * \param r_co: 2D position
+ */
+void GpencilIO::gpencil_3d_point_to_project_space(const float mat[4][4],
+ const float co[3],
+ float r_co[2])
+{
+ float parent_co[3];
+ mul_v3_m4v3(parent_co, diff_mat_, co);
+
+ float tmp[4];
+ copy_v3_v3(tmp, parent_co);
+ tmp[3] = 1.0f;
+ mul_m4_v4(mat, tmp);
+
+ copy_v2_v2(r_co, tmp);
+}
+
+/**
+ * Convert to 2D
+ * \param co: 3D position
+ * \param r_co: 2D position
+ */
+void GpencilIO::gpencil_3d_point_to_2D(const float co[3], float r_co[2])
+{
+ const bool is_camera = (bool)(rv3d_->persp == RV3D_CAMOB);
+ if (is_camera) {
+ gpencil_3d_point_to_project_space(rv3d_->viewmat, co, r_co);
+ }
+ else {
+ gpencil_3d_point_to_screen_space(co, r_co);
+ }
+}
+
/**
* Get average pressure
* \param gps: Pointer to stroke
@@ -293,14 +329,14 @@ float GpencilIO::stroke_point_radius_get(struct bGPDstroke *gps)
float v1[2], screen_co[2], screen_ex[2];
pt = &gps->points[0];
- gpencil_3d_point_to_screen_space(&pt->x, screen_co);
+ gpencil_3d_point_to_2D(&pt->x, screen_co);
/* Radius. */
bGPDstroke *gps_perimeter = BKE_gpencil_stroke_perimeter_from_view(
rv3d_, gpd_, gpl, gps, 3, diff_mat_);
pt = &gps_perimeter->points[0];
- gpencil_3d_point_to_screen_space(&pt->x, screen_ex);
+ gpencil_3d_point_to_2D(&pt->x, screen_ex);
sub_v2_v2v2(v1, screen_co, screen_ex);
float radius = len_v2(v1);
@@ -478,7 +514,7 @@ void GpencilIO::selected_objects_boundbox_set(void)
}
for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
/* Convert to 2D. */
- gpencil_3d_point_to_screen_space(&pt->x, screen_co);
+ gpencil_3d_point_to_2D(&pt->x, screen_co);
minmax_v2v2_v2(r_min, r_max, screen_co);
}
}
diff --git a/source/blender/io/gpencil/intern/gpencil_io_base.h b/source/blender/io/gpencil/intern/gpencil_io_base.h
index 988a184fe58..ac11a7132d9 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_base.h
+++ b/source/blender/io/gpencil/intern/gpencil_io_base.h
@@ -91,6 +91,8 @@ class GpencilIO {
/* Geometry functions. */
bool gpencil_3d_point_to_screen_space(const float co[3], float r_co[2]);
+ void gpencil_3d_point_to_project_space(const float mat[4][4], const float co[3], float r_co[2]);
+ void gpencil_3d_point_to_2D(const float co[3], float r_co[2]);
float stroke_point_radius_get(struct bGPDstroke *gps);
void create_object_list(void);
diff --git a/source/blender/io/gpencil/intern/gpencil_io_export_pdf.cc b/source/blender/io/gpencil/intern/gpencil_io_export_pdf.cc
index 7215f7e1965..816522967b9 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_export_pdf.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_export_pdf.cc
@@ -241,7 +241,7 @@ void GpencilExporterPDF::export_stroke_to_point(void)
float screen_co[2];
bGPDspoint *pt = &gps->points[0];
- gpencil_3d_point_to_screen_space(&pt->x, screen_co);
+ gpencil_3d_point_to_2D(&pt->x, screen_co);
/* Radius. */
float radius = stroke_point_radius_get(gps);
@@ -292,13 +292,12 @@ void GpencilExporterPDF::export_stroke_to_polyline(const bool do_fill, const boo
pt = &gps->points[i];
float screen_co[2];
HPDF_STATUS err;
- if (gpencil_3d_point_to_screen_space(&pt->x, screen_co)) {
- if (i == 0) {
- err = HPDF_Page_MoveTo(page_, screen_co[0], render_y_ - screen_co[1]);
- }
- else {
- err = HPDF_Page_LineTo(page_, screen_co[0], render_y_ - screen_co[1]);
- }
+ gpencil_3d_point_to_2D(&pt->x, screen_co);
+ if (i == 0) {
+ err = HPDF_Page_MoveTo(page_, screen_co[0], render_y_ - screen_co[1]);
+ }
+ else {
+ err = HPDF_Page_LineTo(page_, screen_co[0], render_y_ - screen_co[1]);
}
}
if (do_fill || !normalize) {
diff --git a/source/blender/io/gpencil/intern/gpencil_io_export_svg.cc b/source/blender/io/gpencil/intern/gpencil_io_export_svg.cc
index d19d0668028..b00eafe740d 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_export_svg.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_export_svg.cc
@@ -282,7 +282,7 @@ void GpencilExporterSVG::export_stroke_to_point(pugi::xml_node gpl_node)
color_string_set(gps_node, false);
bGPDspoint *pt = &gps->points[0];
- gpencil_3d_point_to_screen_space(&pt->x, screen_co);
+ gpencil_3d_point_to_2D(&pt->x, screen_co);
gps_node.append_attribute("cx").set_value(screen_co[0]);
gps_node.append_attribute("cy").set_value(screen_co[1]);
@@ -331,7 +331,7 @@ void GpencilExporterSVG::export_stroke_to_path(pugi::xml_node gpl_node, const bo
}
bGPDspoint *pt = &gps->points[i];
float screen_co[2];
- gpencil_3d_point_to_screen_space(&pt->x, screen_co);
+ gpencil_3d_point_to_2D(&pt->x, screen_co);
txt.append(std::to_string(screen_co[0]) + "," + std::to_string(screen_co[1]));
}
/* Close patch (cyclic)*/
@@ -389,7 +389,7 @@ void GpencilExporterSVG::export_stroke_to_polyline(pugi::xml_node gpl_node, cons
}
pt = &gps->points[i];
float screen_co[2];
- gpencil_3d_point_to_screen_space(&pt->x, screen_co);
+ gpencil_3d_point_to_2D(&pt->x, screen_co);
txt.append(std::to_string(screen_co[0]) + "," + std::to_string(screen_co[1]));
}
More information about the Bf-blender-cvs
mailing list