[Bf-blender-cvs] [905b70f9a4c] soc-2019-npr: LANPR: SVG export callbacks.

YimingWu noreply at git.blender.org
Wed Jul 10 07:43:56 CEST 2019


Commit: 905b70f9a4cbe5beaa2b992cf08655f9d9cad8cf
Author: YimingWu
Date:   Wed Jul 10 13:43:35 2019 +0800
Branches: soc-2019-npr
https://developer.blender.org/rB905b70f9a4cbe5beaa2b992cf08655f9d9cad8cf

LANPR: SVG export callbacks.

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

M	source/blender/blenkernel/BKE_writesvg.h
M	source/blender/blenkernel/CMakeLists.txt
M	source/blender/blenkernel/intern/writesvg.c
M	source/blender/draw/engines/lanpr/lanpr_all.h
M	source/blender/draw/engines/lanpr/lanpr_data_types.h
M	source/blender/draw/engines/lanpr/lanpr_ops.c

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

diff --git a/source/blender/blenkernel/BKE_writesvg.h b/source/blender/blenkernel/BKE_writesvg.h
index a597abb8d03..807775f65f8 100644
--- a/source/blender/blenkernel/BKE_writesvg.h
+++ b/source/blender/blenkernel/BKE_writesvg.h
@@ -25,6 +25,7 @@
  */
 
 bool BKE_svg_data_from_gpencil(struct bGPdata* gpd, struct Text* ta, struct bGPDlayer* layer, int frame);
+bool BKE_svg_data_from_lanpr_chain(Text* ta, struct LANPR_RenderBuffer* rb, struct LANPR_LineLayer* ll);
 
 
 #endif
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index f0373016e95..77c421b5919 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -50,6 +50,8 @@ set(INC
   ../../../intern/opensubdiv
   ../../../extern/curve_fit_nd
   ../../../intern/smoke/extern
+
+  ../draw/engines/lanpr
 )
 
 set(INC_SYS
diff --git a/source/blender/blenkernel/intern/writesvg.c b/source/blender/blenkernel/intern/writesvg.c
index 86ab34051fe..5f3d951d0e9 100644
--- a/source/blender/blenkernel/intern/writesvg.c
+++ b/source/blender/blenkernel/intern/writesvg.c
@@ -36,6 +36,10 @@
 #include "DNA_screen_types.h"
 #include "DNA_text_types.h"
 
+/* For LANPR */
+#include "DNA_lanpr_types.h"
+#include "lanpr_data_types.h"
+
 #include "DEG_depsgraph.h"
 
 #include "MEM_guardedalloc.h"
@@ -94,6 +98,12 @@ typedef struct GPencilSVGIterator{
     int point_i;
 }GPencilSVGIterator;
 
+typedef struct LanprSVGIterator{
+    LANPR_RenderLineChain* rlc;
+    LANPR_LineLayer* ll;
+    LANPR_RenderLineChainItem * rlci;
+}LanprSVGIterator;
+
 static int svg_gpencil_get_path_callback(GPencilSVGIterator* iterator, float* fill_color, float* stroke_color, float* stroke_width){
     GPencilSVGIterator* sr = (GPencilSVGIterator*)iterator;
     if(!sr->stroke){
@@ -114,7 +124,6 @@ static int svg_gpencil_get_path_callback(GPencilSVGIterator* iterator, float* fi
     zero_v3(stroke_color);
     return 1;
 }
-
 static int svg_gpencil_get_node_callback(GPencilSVGIterator* iterator, float* x, float* y){
     GPencilSVGIterator* sr = (GPencilSVGIterator*)iterator;
     if(!sr->point){
@@ -164,3 +173,69 @@ bool BKE_svg_data_from_gpencil(bGPdata* gpd, Text* ta, bGPDlayer* layer, int fra
 
     return true;
 }
+
+static bool lanpr_chain_match_layer(LANPR_RenderLineChain* rlc, LANPR_LineLayer* ll){
+    if(!rlc || !ll){
+        return false;
+    }
+    if(ll->use_multiple_levels){
+        if(rlc->level>=ll->qi_begin && rlc->level<=ll->qi_end){
+            return true;
+        }
+    }else{
+        if(rlc->level == ll->qi_begin){
+            return true;
+        }
+    }
+    return false;
+}
+static int svg_lanpr_get_path_callback(LanprSVGIterator* iterator, float* fill_color, float* stroke_color, float* stroke_width){
+    LanprSVGIterator* lsi = (LanprSVGIterator*)iterator;
+    if(lsi->rlc){
+        lsi->rlc = lsi->rlc->next;
+        while(lsi->rlc && !lanpr_chain_match_layer(lsi->rlc,lsi->ll)){
+            lsi->rlc = lsi->rlc->next;
+        }
+        if(lsi->rlc)
+            lsi->rlci = lsi->rlc->chain.first;
+    }else{
+        return 0;
+    }
+
+    *stroke_width = lsi->ll->thickness;
+    
+    /* TODO: no material access yet */
+    zero_v3(fill_color);
+    zero_v3(stroke_color);
+    return 1;
+}
+static int svg_lanpr_get_node_callback(LanprSVGIterator* iterator, float* x, float* y){
+    LanprSVGIterator* lsi = (LanprSVGIterator*)iterator;
+    if(!lsi->rlci){
+        return 0;
+    }else{
+        *x = lsi->rlci->pos[0];
+        *y = lsi->rlci->pos[1];
+        lsi->rlci = lsi->rlci->next;
+        return 1;
+    }
+}
+
+bool BKE_svg_data_from_lanpr_chain(Text* ta, LANPR_RenderBuffer* rb, LANPR_LineLayer* ll){
+    if(!ll || !rb || !rb->chains.first){
+        return false;
+    }
+
+    LanprSVGIterator lsi;
+    lsi.ll = ll;
+    lsi.rlc = rb->chains.first;
+    lsi.rlci = lsi.rlc->chain.first;
+
+    write_svg_head(ta);
+
+    write_paths_from_callback(&lsi, ta, svg_lanpr_get_path_callback,svg_lanpr_get_node_callback);
+
+    write_svg_end(ta);
+
+    return true;
+}
diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index 20951373469..b8ce39af596 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -287,107 +287,6 @@ typedef struct LANPR_RenderTaskInfo {
 
 } LANPR_RenderTaskInfo;
 
-typedef struct LANPR_RenderBuffer {
-  struct LANPR_RenderBuffer *prev, *next;
-
-  int is_copied; /*  for render. */
-
-  int w, h;
-  int tile_size_w, tile_size_h;
-  int tile_count_x, tile_count_y;
-  real width_per_tile, height_per_tile;
-  tnsMatrix44d view_projection;
-  tnsMatrix44d vp_inverse;
-
-  int output_mode;
-  int output_aa_level;
-
-  struct LANPR_BoundingArea *initial_bounding_areas;
-  u32bit bounding_area_count;
-
-  ListBase vertex_buffer_pointers;
-  ListBase line_buffer_pointers;
-  ListBase triangle_buffer_pointers;
-  ListBase all_render_lines;
-
-  ListBase intersecting_vertex_buffer;
-
-  struct GPUBatch *DPIXIntersectionTransformBatch;
-  struct GPUBatch *DPIXIntersectionBatch;
-
-  /* use own-implemented one */
-  LANPR_StaticMemPool render_data_pool;
-
-  Material *material_pointers[2048];
-
-  /*  render status */
-
-  int cached_for_frame;
-
-  real view_vector[3];
-
-  int triangle_size;
-
-  u32bit contour_count;
-  u32bit contour_processed;
-  LinkData *contour_managed;
-  ListBase contours;
-
-  u32bit intersection_count;
-  u32bit intersection_processed;
-  LinkData *intersection_managed;
-  ListBase intersection_lines;
-
-  u32bit crease_count;
-  u32bit crease_processed;
-  LinkData *crease_managed;
-  ListBase crease_lines;
-
-  u32bit material_line_count;
-  u32bit material_processed;
-  LinkData *material_managed;
-  ListBase material_lines;
-
-  u32bit edge_mark_count;
-  u32bit edge_mark_processed;
-  LinkData *edge_mark_managed;
-  ListBase edge_marks;
-
-  ListBase chains;
-  GPUBatch *chain_draw_batch;
-
-  DRWShadingGroup *ChainShgrp;
-
-  SpinLock cs_info;
-  SpinLock cs_data;
-  SpinLock cs_management;
-
-  /*  settings */
-
-  int max_occlusion_level;
-  real crease_angle;
-  real crease_cos;
-  int thread_count;
-
-  real overall_progress;
-  int calculation_status;
-
-  int draw_material_preview;
-  real material_transparency;
-
-  int show_line;
-  int show_fast;
-  int show_material;
-  int override_display;
-
-  struct Scene *scene;
-  struct Object *camera;
-
-  int enable_intersections;
-  int _pad;
-
-} LANPR_RenderBuffer;
-
 #define TNS_CULL_DISCARD 2
 #define TNS_CULL_USED 1
 
diff --git a/source/blender/draw/engines/lanpr/lanpr_data_types.h b/source/blender/draw/engines/lanpr/lanpr_data_types.h
index a77a755be75..60cb97d30c1 100644
--- a/source/blender/draw/engines/lanpr/lanpr_data_types.h
+++ b/source/blender/draw/engines/lanpr/lanpr_data_types.h
@@ -148,4 +148,105 @@ typedef struct LANPR_ChainRegisterEntry {
   char is_left; /*  left/right mark. Because we revert list in chaining and we need the flag. */
 } LANPR_ChainRegisterEntry;
 
+typedef struct LANPR_RenderBuffer {
+  struct LANPR_RenderBuffer *prev, *next;
+
+  int is_copied; /*  for render. */
+
+  int w, h;
+  int tile_size_w, tile_size_h;
+  int tile_count_x, tile_count_y;
+  real width_per_tile, height_per_tile;
+  tnsMatrix44d view_projection;
+  tnsMatrix44d vp_inverse;
+
+  int output_mode;
+  int output_aa_level;
+
+  struct LANPR_BoundingArea *initial_bounding_areas;
+  u32bit bounding_area_count;
+
+  ListBase vertex_buffer_pointers;
+  ListBase line_buffer_pointers;
+  ListBase triangle_buffer_pointers;
+  ListBase all_render_lines;
+
+  ListBase intersecting_vertex_buffer;
+
+  struct GPUBatch *DPIXIntersectionTransformBatch;
+  struct GPUBatch *DPIXIntersectionBatch;
+
+  /* use own-implemented one */
+  LANPR_StaticMemPool render_data_pool;
+
+  struct Material *material_pointers[2048];
+
+  /*  render status */
+
+  int cached_for_frame;
+
+  real view_vector[3];
+
+  int triangle_size;
+
+  u32bit contour_count;
+  u32bit contour_processed;
+  LinkData *contour_managed;
+  ListBase contours;
+
+  u32bit intersection_count;
+  u32bit intersection_processed;
+  LinkData *intersection_managed;
+  ListBase intersection_lines;
+
+  u32bit crease_count;
+  u32bit crease_processed;
+  LinkData *crease_managed;
+  ListBase crease_lines;
+
+  u32bit material_line_count;
+  u32bit material_processed;
+  LinkData *material_managed;
+  ListBase material_lines;
+
+  u32bit edge_mark_count;
+  u32bit edge_mark_processed;
+  LinkData *edge_mark_managed;
+  ListBase edge_marks;
+
+  ListBase chains;
+  struct GPUBatch *chain_draw_batch;
+
+  struct DRWShadingGroup *ChainShgrp;
+
+  SpinLock cs_info;
+  SpinLock cs_data;
+  SpinLock cs_management;
+
+  /*  settings */
+
+  int max_occlusion_level;
+  real crease_angle;
+  real crease_cos;
+  int thread_count;
+
+  real overall_progress;
+  int calculation_status;
+
+  int draw_material_preview;
+  real material_transparency;
+
+  int show_line;
+  int show_fast;
+  int show_material;
+  int override_display;
+
+  struct Scene *scene;
+  struct Object *camera;
+
+  int enable_intersections;
+  int _pad;
+
+} LANPR_RenderBuffer;
+
 #endif
\ No newline at end of file
diff --git a/source/blender/draw/engines/lanpr/lanpr_ops.c b/source/blender/draw/engines/lanpr/lanpr_ops.c
index d5716051d4e..00ab356fb38 100644
--- a/source/blender/draw/engines/lanpr/lanpr_ops.c
+++ b/source/blender/draw/engines/lanpr/lanpr_ops.c
@@ -25,6 +25,7 @@
 #include "BKE_report.h"
 #include "BKE_screen.h"
 #include "BKE_text.h"
+#include "BKE_writesvg.h"
 #include "GPU_draw.h"
 
 #include "GPU_batch.h"
@@ -5123,7 +5124,7 @@ static int lanpr_export_svg_exec(bContext *C, wmOperator *op)
 
   for(ll = lanpr->line_layers.first; ll; ll = ll->next){
     Text *ta = BKE_text_add(CTX_data_main(C),"exported_svg");
-    /* exporter here */
+    BKE_svg_data_from_lanpr_chain(ta,rb,ll);
   }
 
   return OPERATOR_FINISHED;



More information about the Bf-blender-cvs mailing list