[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