[Bf-blender-cvs] [09d163ac04c] greasepencil-object: GPencil: Sort objects in zdepth before exporting to SVG

Antonio Vazquez noreply at git.blender.org
Sat Aug 1 11:19:49 CEST 2020


Commit: 09d163ac04c519da4d2614c7a754a5aa4085c5bb
Author: Antonio Vazquez
Date:   Sat Aug 1 11:15:49 2020 +0200
Branches: greasepencil-object
https://developer.blender.org/rB09d163ac04c519da4d2614c7a754a5aa4085c5bb

GPencil: Sort objects in zdepth before exporting to SVG

===================================================================

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
M	source/blender/io/gpencil/intern/gpencil_io_svg.h

===================================================================

diff --git a/source/blender/io/gpencil/intern/gpencil_io_base.cc b/source/blender/io/gpencil/intern/gpencil_io_base.cc
index 762e8546b02..8b1c5fc0a40 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_base.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_base.cc
@@ -19,7 +19,6 @@
  */
 #include <algorithm>
 #include <cctype>
-
 #include <iostream>
 #include <string>
 
@@ -54,51 +53,61 @@
 
 #include "pugixml.hpp"
 
-namespace blender {
-namespace io {
-namespace gpencil {
+namespace blender::io::gpencil {
 
 /* Constructor. */
 GpencilExporter::GpencilExporter(const struct GpencilExportParams *iparams)
 {
-  params.frame_start = iparams->frame_start;
-  params.frame_end = iparams->frame_end;
-  params.obact = iparams->obact;
-  params.region = iparams->region;
-  params.C = iparams->C;
-  params.filename = iparams->filename;
-  params.mode = iparams->mode;
-  params.flag = iparams->flag;
+  params_.frame_start = iparams->frame_start;
+  params_.frame_end = iparams->frame_end;
+  params_.obact = iparams->obact;
+  params_.region = iparams->region;
+  params_.C = iparams->C;
+  params_.filename = iparams->filename;
+  params_.mode = iparams->mode;
+  params_.flag = iparams->flag;
 
   /* Easy access data. */
-  bmain = CTX_data_main(params.C);
-  depsgraph = CTX_data_depsgraph_pointer(params.C);
-  rv3d = (RegionView3D *)params.region->regiondata;
-  gpd = (bGPdata *)params.obact->data;
+  bmain = CTX_data_main(params_.C);
+  depsgraph = CTX_data_depsgraph_pointer(params_.C);
+  rv3d = (RegionView3D *)params_.region->regiondata;
+  gpd = (bGPdata *)params_.obact->data;
 
-  winx = params.region->winx;
-  winy = params.region->winy;
+  winx = params_.region->winx;
+  winy = params_.region->winy;
 
   /* Prepare output filename with full path. */
-  set_out_filename(params.filename);
+  set_out_filename(params_.filename);
 
   /* Load list of selected objects. */
-  ViewLayer *view_layer = CTX_data_view_layer(params.C);
+  float camera_z_axis[3];
+  copy_v3_v3(camera_z_axis, rv3d->viewinv[2]);
+
+  ViewLayer *view_layer = CTX_data_view_layer(params_.C);
   LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
     Object *object = base->object;
 
     if (object->type != OB_GPENCIL) {
       continue;
     }
-    if (((params.flag & GP_EXPORT_SELECTED_OBJECTS) == 0) && (params.obact != object)) {
+    if (((params_.flag & GP_EXPORT_SELECTED_OBJECTS) == 0) && (params_.obact != object)) {
       continue;
     }
 
     if (base->flag & BASE_SELECTED) {
-      ob_list.push_back(object);
+      /* Save zdepth from view to sort from back to front. */
+      float camera_z = dot_v3v3(camera_z_axis, object->obmat[3]);
+      ObjectZ obz = {camera_z, object};
+      // obz.zdepth = camera_z;
+      // obz.ob = object;
+      ob_list.push_back(obz);
     }
   }
+
+  /* Sort list of objects from point of view. */
+  ob_list.sort([](const ObjectZ &obz1, const ObjectZ &obz2) { return obz1.zdepth < obz2.zdepth; });
 }
+
 /**
  * Set output file input_text full path.
  * \param C: Context.
@@ -122,7 +131,7 @@ bool GpencilExporter::gpencil_3d_point_to_screen_space(const float co[3], float
   mul_v3_m4v3(parent_co, diff_mat, co);
   float screen_co[2];
   eV3DProjTest test = (eV3DProjTest)(V3D_PROJ_RET_OK);
-  if (ED_view3d_project_float_global(params.region, parent_co, screen_co, test) ==
+  if (ED_view3d_project_float_global(params_.region, parent_co, screen_co, test) ==
       V3D_PROJ_RET_OK) {
     if (!ELEM(V2D_IS_CLIPPED, screen_co[0], screen_co[1])) {
       copy_v2_v2(r_co, screen_co);
@@ -270,7 +279,7 @@ struct bGPDlayer *GpencilExporter::gpl_current_get(void)
 void GpencilExporter::gpl_current_set(struct bGPDlayer *gpl)
 {
   gpl_cur = gpl;
-  BKE_gpencil_parent_matrix_get(depsgraph, params.obact, gpl, diff_mat);
+  BKE_gpencil_parent_matrix_get(depsgraph, params_.obact, gpl, diff_mat);
 }
 
 struct bGPDframe *GpencilExporter::gpf_current_get(void)
@@ -342,6 +351,4 @@ float GpencilExporter::stroke_average_opacity(void)
   return avg_opacity;
 }
 
-}  // namespace gpencil
-}  // namespace io
-}  // namespace blender
+}  // 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 d0139548d87..38e53d8079f 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_base.h
+++ b/source/blender/io/gpencil/intern/gpencil_io_base.h
@@ -38,9 +38,7 @@ struct bGPDframe;
 struct bGPDstroke;
 struct MaterialGPencilStyle;
 
-namespace blender {
-namespace io {
-namespace gpencil {
+namespace blender::io::gpencil {
 
 class GpencilExporter {
 
@@ -61,10 +59,18 @@ class GpencilExporter {
  protected:
   bool invert_axis[2];
   float diff_mat[4][4];
-  GpencilExportParams params;
+  GpencilExportParams params_;
   char out_filename[FILE_MAX];
 
-  std::list<Object *> ob_list;
+  struct ObjectZ {
+    float zdepth;
+    struct Object *ob;
+    // ObjectZ(int izdepth, Object *iob) : zdepth(izdepth), ob(iob)
+    //{
+    //}
+  };
+
+  std::list<ObjectZ> ob_list;
 
   /* Data for easy access. */
   struct Depsgraph *depsgraph;
@@ -99,6 +105,4 @@ class GpencilExporter {
   void set_out_filename(char *filename);
 };
 
-}  // namespace gpencil
-}  // namespace io
-}  // namespace blender
+}  // namespace blender::io::gpencil
diff --git a/source/blender/io/gpencil/intern/gpencil_io_svg.cc b/source/blender/io/gpencil/intern/gpencil_io_svg.cc
index 246bb2ed730..66446ee0cfb 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_svg.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_svg.cc
@@ -18,7 +18,6 @@
  * \ingroup bgpencil
  */
 #include <iostream>
-#include <iterator>
 #include <list>
 #include <string>
 
@@ -58,9 +57,7 @@
 
 #include "pugixml.hpp"
 
-namespace blender {
-namespace io {
-namespace gpencil {
+namespace blender ::io ::gpencil {
 
 /* Constructor. */
 GpencilExporterSVG::GpencilExporterSVG(const struct GpencilExportParams *iparams)
@@ -119,11 +116,10 @@ void GpencilExporterSVG::create_document_header(void)
 /* Main layer loop. */
 void GpencilExporterSVG::export_layers(void)
 {
-  std::list<Object *>::iterator it;
-  for (it = ob_list.begin(); it != ob_list.end(); ++it) {
-    Object *ob = (Object *)*it;
+  for (ObjectZ &obz : ob_list) {
+    Object *ob = obz.ob;
     pugi::xml_node ob_node = main_node.append_child("g");
-    ob_node.append_attribute("id").set_value(ob->id.name + 2);
+    ob_node.append_attribute("zdepth").set_value(ob->id.name + 2);
 
     /* Use evaluated version to get strokes with modifiers. */
     Object *ob_eval_ = (Object *)DEG_get_evaluated_id(depsgraph, &ob->id);
@@ -140,7 +136,7 @@ void GpencilExporterSVG::export_layers(void)
       txt.append(gpl->info);
       main_node.append_child(pugi::node_comment).set_value(txt.c_str());
       pugi::xml_node gpl_node = ob_node.append_child("g");
-      gpl_node.append_attribute("id").set_value(gpl->info);
+      gpl_node.append_attribute("zdepth").set_value(gpl->info);
 
       bGPDframe *gpf = gpl->actframe;
       if (gpf == NULL) {
@@ -167,11 +163,11 @@ void GpencilExporterSVG::export_layers(void)
           export_point(gpl_node);
         }
         else {
-          bool is_normalized = ((params.flag & GP_EXPORT_NORM_THICKNESS) != 0) ||
+          bool is_normalized = ((params_.flag & GP_EXPORT_NORM_THICKNESS) != 0) ||
                                is_stroke_thickness_constant(gps);
 
           /* Fill. */
-          if ((gp_style_is_fill()) && (params.flag & GP_EXPORT_FILL)) {
+          if ((gp_style_is_fill()) && (params_.flag & GP_EXPORT_FILL)) {
             if (is_normalized) {
               export_stroke_polyline(gpl_node, true);
             }
@@ -377,6 +373,4 @@ void GpencilExporterSVG::color_string_set(pugi::xml_node gps_node, const bool is
   }
 }
 
-}  // namespace gpencil
-}  // namespace io
-}  // namespace blender
+}  // namespace blender::io::gpencil
diff --git a/source/blender/io/gpencil/intern/gpencil_io_svg.h b/source/blender/io/gpencil/intern/gpencil_io_svg.h
index ae67b903812..76ab3986652 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_svg.h
+++ b/source/blender/io/gpencil/intern/gpencil_io_svg.h
@@ -36,9 +36,7 @@ struct MaterialGPencilStyle;
 
 #define SVG_EXPORTER_VERSION " Generator: Blender, SVG Export for Grease Pencil v1.0 "
 
-namespace blender {
-namespace io {
-namespace gpencil {
+namespace blender::io::gpencil {
 
 class GpencilExporterSVG : public GpencilExporter {
 
@@ -64,6 +62,4 @@ class GpencilExporterSVG : public GpencilExporter {
   void color_string_set(pugi::xml_node gps_node, const bool is_fill);
 };
 
-}  // namespace gpencil
-}  // namespace io
-}  // namespace blender
+}  // namespace blender::io::gpencil



More information about the Bf-blender-cvs mailing list