[Bf-blender-cvs] [b385f6ea72e] greasepencil-object: More test
Antonio Vazquez
noreply at git.blender.org
Sat Jul 25 16:33:28 CEST 2020
Commit: b385f6ea72e0c9a83f4dee2997c0c455354729f1
Author: Antonio Vazquez
Date: Fri Jul 24 16:03:21 2020 +0200
Branches: greasepencil-object
https://developer.blender.org/rBb385f6ea72e0c9a83f4dee2997c0c455354729f1
More test
===================================================================
M source/blender/editors/io/io_gpencil.c
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 5685dd87abe..7c586ff4787 100644
--- a/source/blender/editors/io/io_gpencil.c
+++ b/source/blender/editors/io/io_gpencil.c
@@ -65,6 +65,8 @@ static int wm_gpencil_export_invoke(bContext *C, wmOperator *op, const wmEvent *
{
UNUSED_VARS(event);
+ RegionView3D *rv3d = CTX_wm_region_view3d(C);
+
// if (!RNA_struct_property_is_set(op->ptr, "as_background_job")) {
// RNA_boolean_set(op->ptr, "as_background_job", true);
//}
diff --git a/source/blender/io/gpencil/intern/gpencil_io_svg.cc b/source/blender/io/gpencil/intern/gpencil_io_svg.cc
index 44bc22e0ef1..42693946a8a 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_svg.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_svg.cc
@@ -20,20 +20,27 @@
#include <iostream>
#include "BKE_context.h"
+#include "BKE_gpencil.h"
#include "BKE_main.h"
#include "BLI_blenlib.h"
+#include "BLI_math.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "DNA_gpencil_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
#ifdef WIN32
# include "utfconv.h"
#endif
-#include <fstream>
+#include "UI_view2d.h"
+
+#include "ED_view3d.h"
#include "gpencil_io_exporter.h"
#include "gpencil_io_svg.h"
@@ -55,6 +62,25 @@ void GpencilExporter::set_out_filename(struct bContext *C, char *filename)
//#endif
}
+static ARegion *get_3d_region(struct bContext *C)
+{
+ bScreen *screen = CTX_wm_screen(C);
+ LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
+ LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
+ if (region->regiontype == RGN_TYPE_WINDOW) {
+ return region;
+ }
+ }
+ // LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
+ // if (sl->spacetype == SPACE_VIEW3D) {
+ // return (ARegion *)sl->regionbase.first;
+ // }
+ //}
+ }
+
+ return CTX_wm_region(C);
+}
+
/* Constructor. */
GpencilExporterSVG::GpencilExporterSVG(const struct GpencilExportParams *params)
{
@@ -67,6 +93,30 @@ GpencilExporterSVG::GpencilExporterSVG(const struct GpencilExportParams *params)
/* Prepare output filename with full path. */
set_out_filename(params->C, params->filename);
+
+ this->region = get_3d_region(params->C);
+}
+
+/* Convert to screen space.
+ * TODO: Cleanup using a more generic BKE function. */
+static bool gpencil_3d_point_to_screen_space(ARegion *region,
+ const float diff_mat[4][4],
+ const float co[3],
+ int r_co[2])
+{
+ float parent_co[3];
+ mul_v3_m4v3(parent_co, diff_mat, co);
+ int screen_co[2];
+ eV3DProjTest test = (eV3DProjTest)(V3D_PROJ_RET_CLIP_BB | V3D_PROJ_RET_CLIP_WIN);
+ if (ED_view3d_project_int_global(region, parent_co, screen_co, test) == V3D_PROJ_RET_OK) {
+ if (!ELEM(V2D_IS_CLIPPED, screen_co[0], screen_co[1])) {
+ copy_v2_v2_int(r_co, screen_co);
+ return true;
+ }
+ }
+ r_co[0] = V2D_IS_CLIPPED;
+ r_co[1] = V2D_IS_CLIPPED;
+ return false;
}
/* Main write method for SVG format. */
@@ -121,7 +171,9 @@ void GpencilExporterSVG::create_document_header(void)
/* Main layer loop. */
void GpencilExporterSVG::layers_loop(void)
{
+ Depsgraph *depsgraph = CTX_data_depsgraph_pointer(params.C);
Object *ob = params.ob;
+
bGPdata *gpd = (bGPdata *)ob->data;
LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
/* Layer node. */
@@ -137,10 +189,19 @@ void GpencilExporterSVG::layers_loop(void)
}
LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
+ float diff_mat[4][4];
+ BKE_gpencil_parent_matrix_get(depsgraph, ob, gpl, diff_mat);
+
pugi::xml_node gps_node = gpl_node.append_child("path");
gps_node.append_attribute("fill").set_value("#000000");
gps_node.append_attribute("stroke").set_value("#000000");
gps_node.append_attribute("stroke-width").set_value("0.5");
+
+ for (int i = 0; i < gps->totpoints; i++) {
+ bGPDspoint *pt = &gps->points[i];
+ int screen_co[2];
+ gpencil_3d_point_to_screen_space(region, diff_mat, &pt->x, screen_co);
+ }
}
}
}
diff --git a/source/blender/io/gpencil/intern/gpencil_io_svg.h b/source/blender/io/gpencil/intern/gpencil_io_svg.h
index bd14029181e..14364ac6ba1 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_svg.h
+++ b/source/blender/io/gpencil/intern/gpencil_io_svg.h
@@ -24,6 +24,7 @@
struct Main;
struct GpencilExportParams;
+struct ARegion;
namespace blender {
namespace io {
@@ -43,6 +44,8 @@ class GpencilExporter {
class GpencilExporterSVG : public GpencilExporter {
public:
+ ARegion *region;
+
GpencilExporterSVG(const struct GpencilExportParams *params);
bool write(void);
More information about the Bf-blender-cvs
mailing list