[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