[Bf-blender-cvs] [c4583135e7b] soc-2018-npr: line drawing in one batch, greatly improve performance. modified UI.

Nick Wu noreply at git.blender.org
Tue May 29 16:08:08 CEST 2018


Commit: c4583135e7b38b89d9ed55b5cf1b42c9f1f9b659
Author: Nick Wu
Date:   Tue May 29 22:04:19 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rBc4583135e7b38b89d9ed55b5cf1b42c9f1f9b659

line drawing in one batch, greatly improve performance. modified UI.

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

M	release/scripts/startup/bl_ui/properties_scene.py
M	source/blender/draw/engines/lanpr/NUL_TNS_EdgeRendering.c
M	source/blender/makesdna/DNA_lanpr_types.h
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_scene.c

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

diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py
index f0ae8917900..4f1c19f61c2 100644
--- a/release/scripts/startup/bl_ui/properties_scene.py
+++ b/release/scripts/startup/bl_ui/properties_scene.py
@@ -456,43 +456,52 @@ class SCENE_PT_lanpr(SceneButtonsPanel, PropertyPanel, Panel):
         scene = context.scene
         lanpr = scene.lanpr
         layout.label(text="Global:")
-        layout.prop(lanpr, "enable_post_processing")
-        layout.label(text="Enter 0.0001 to 0.002:")
+        layout.prop(lanpr, "enable_vector_trace")
+
+        if lanpr.enable_vector_trace == "DISABLED":
+            layout.prop(lanpr, "display_thinning_result")
+
         layout.prop(lanpr, "depth_clamp")
-        layout.label(text="Enter 500 to 1000:")
         layout.prop(lanpr, "depth_strength")
-        layout.label(text="Enter 2:")
         layout.prop(lanpr, "normal_clamp")
-        layout.label(text="Enter 10:")
         layout.prop(lanpr, "normal_strength")
 
-        split = layout.split()
-        col = split.column()
-        col.label(text="Background Color:")
-        col.prop(lanpr, "background_color")
-        col = split.column()
-        col.label(text="Line Color:")
-        col.prop(lanpr, "line_color")
-        
-        layout.label(text="Thickness:")
-        layout.prop(lanpr, "line_thickness")
-        layout.label(text="Taper Settings:")
-        layout.prop(lanpr, "use_same_taper")
+        if lanpr.enable_vector_trace == "ENABLED":
 
-        if lanpr.use_same_taper == "DISABLED":
             split = layout.split()
             col = split.column()
-            col.label(text="Left:")
-            col.prop(lanpr,"taper_left_distance")
-            col.prop(lanpr,"taper_left_strength")
+            col.prop(lanpr, "background_color")
             col = split.column()
-            col.label(text="Right:")
-            col.prop(lanpr,"taper_right_distance")
-            col.prop(lanpr,"taper_right_strength")
-        else:
-            layout.prop(lanpr,"taper_left_distance")
-            layout.prop(lanpr,"taper_left_strength")
+            col.prop(lanpr, "line_color")
             
+            layout.label(text="Thickness:")
+            layout.prop(lanpr, "line_thickness")
+
+            layout.label(text="Effect Settings:")
+
+            layout.prop(lanpr, "use_same_taper")
+
+            if lanpr.use_same_taper == "DISABLED":
+                split = layout.split()
+                col = split.column()
+                col.label(text="Left:")
+                col.prop(lanpr,"taper_left_distance")
+                col.prop(lanpr,"taper_left_strength")
+                col = split.column()
+                col.label(text="Right:")
+                col.prop(lanpr,"taper_right_distance")
+                col.prop(lanpr,"taper_right_strength")
+            else:
+                layout.prop(lanpr,"taper_left_distance")
+                layout.prop(lanpr,"taper_left_strength") 
+
+            layout.prop(lanpr, "enable_tip_extend")
+            if lanpr.enable_tip_extend == "ENABLED":
+                layout.prop(lanpr,"extend_length")
+        
+        else: #disabled vectorization
+            layout.label(text="Adjust values to avoid large pure white regions!")
+                
 
 
 
diff --git a/source/blender/draw/engines/lanpr/NUL_TNS_EdgeRendering.c b/source/blender/draw/engines/lanpr/NUL_TNS_EdgeRendering.c
index 562636ed669..8500fe02768 100644
--- a/source/blender/draw/engines/lanpr/NUL_TNS_EdgeRendering.c
+++ b/source/blender/draw/engines/lanpr/NUL_TNS_EdgeRendering.c
@@ -69,7 +69,7 @@ static void lanpr_engine_init(void *ved){
 	DRW_texture_ensure_fullscreen_2D(&txl->depth, GPU_DEPTH_COMPONENT32F, DRW_TEX_FILTER | DRW_TEX_MIPMAP);
 	DRW_texture_ensure_fullscreen_2D(&txl->color, GPU_RGBA16F, DRW_TEX_FILTER | DRW_TEX_MIPMAP);
 	DRW_texture_ensure_fullscreen_2D(&txl->normal, GPU_RGBA16F, DRW_TEX_FILTER | DRW_TEX_MIPMAP);
-    DRW_texture_ensure_fullscreen_2D(&txl->edge_intermediate, GPU_RGBA8, DRW_TEX_FILTER | DRW_TEX_MIPMAP);
+    DRW_texture_ensure_fullscreen_2D(&txl->edge_intermediate, GPU_RGBA16F, DRW_TEX_FILTER | DRW_TEX_MIPMAP);
 	
 	GPU_framebuffer_ensure_config(&fbl->passes, {
 		GPU_ATTACHMENT_TEXTURE(txl->depth),
@@ -435,45 +435,66 @@ void lanpr_texture_to_ndc(int x,int y, int w,int h, float* x_ndc, float* y_ndc){
 	*y_ndc = tnsLinearItp(-1,1, (float)y/(float)h);
 }
 
-Gwn_Batch *lanpr_get_snake_batch(LANPR_PrivateData* pd, LANPR_LineStrip* ls){
-	int Count = ls->point_count;
+void lanpr_count_drawing_elements(LANPR_PrivateData* pd, int* vert_count, int* index_adjacent_count){
+    int v_count=0;
+	int e_count=0;
+	LANPR_LineStrip* ls;
+	for (ls = (LANPR_LineStrip *)(pd->line_strips.first); ls; ls = (LANPR_LineStrip *)(ls->Item.next)) {
+		v_count += (ls->point_count);
+		e_count += ((ls->point_count - 1) * 4);
+	}
+	*vert_count = v_count;
+	*index_adjacent_count = e_count;
+}
+
+Gwn_Batch *lanpr_get_snake_batch(LANPR_PrivateData* pd){
+	LANPR_LineStrip* ls;
+	LANPR_LineStripPoint* lsp, *plsp;
 	int i;
-	LANPR_LineStripPoint* lsp,*plsp;
 	u32bit *Index_adjacent;
 	float* Verts;
 	float* Lengths;
 	float TotalLength=0;
+	int v_count,e_count;
+
+	lanpr_count_drawing_elements(pd,&v_count,&e_count);
 
-	Index_adjacent = MEM_callocN(sizeof(unsigned int) * (Count - 1) * 4, "Index_adjacent buffer pre alloc");
-	Verts = MEM_callocN(sizeof(float) * Count * 2, "Verts buffer pre alloc");
-	Lengths = MEM_callocN(sizeof(float)* Count, "Length buffer pre alloc");
+	//Index_adjacent = MEM_callocN(sizeof(unsigned int) * e_count, "Index_adjacent buffer pre alloc");
+	Verts = MEM_callocN(sizeof(float) * v_count * 2, "Verts buffer pre alloc");
+	Lengths = MEM_callocN(sizeof(float)* v_count, "Length buffer pre alloc");
 
 	Gwn_IndexBufBuilder elb;
-	GWN_indexbuf_init_ex(&elb, GWN_PRIM_LINES_ADJ, (Count - 1) * 4, Count, true);
-
-	for (i = 0; i < Count-1; i++) {
-		Index_adjacent[i * 4 + 0] = i - 1;
-		Index_adjacent[i * 4 + 1] = i;
-		Index_adjacent[i * 4 + 2] = i + 1;
-		Index_adjacent[i * 4 + 3] = i + 2;
-		GWN_indexbuf_add_line_adj_verts(&elb, (i-1<0?0:i-1), i, i+1, (i+2>=Count-1?Count-1:i+2));
-	}
-	Index_adjacent[0] = 0;
-	Index_adjacent[(Count - 1) * 4 - 1] = Count-1;
-
-	i = 0;
-	float xf,yf;
-	for (lsp = (LANPR_LineStripPoint *)(ls->points.first); lsp; lsp = (LANPR_LineStripPoint *)(lsp->Item.next)) {
-		lanpr_texture_to_ndc(lsp->P[0],lsp->P[1],pd->width, pd->height, &xf,&yf);
-		Verts[i * 2 + 0] = xf;
-		Verts[i * 2 + 1] = yf;
-		if (plsp = (LANPR_LineStripPoint *)(lsp->Item.prev)) {
-			TotalLength += tMatDist2v(plsp->P, lsp->P);
-			Lengths[i] = TotalLength;
+	GWN_indexbuf_init_ex(&elb, GWN_PRIM_LINES_ADJ, e_count, v_count, true);
+
+	int vert_offset=0;
+
+	for (ls = (LANPR_LineStrip *)(pd->line_strips.first); ls; ls = (LANPR_LineStrip *)(ls->Item.next)) {
+		for (i = 0; i < ls->point_count-1; i++) {
+			int v1 = i+vert_offset-1;
+			int v2 = i+vert_offset;
+			int v3 = i+vert_offset+1;
+			int v4 = i+vert_offset+2;
+			if(v1<0) v1=0;
+			if(v4>= v_count) v4 = v_count -1;
+			GWN_indexbuf_add_line_adj_verts(&elb, v1,v2,v3,v4);
+		}
+
+		i = 0;
+		float xf,yf;
+		for (lsp = (LANPR_LineStripPoint *)(ls->points.first); lsp; lsp = (LANPR_LineStripPoint *)(lsp->Item.next)) {
+			lanpr_texture_to_ndc(lsp->P[0],lsp->P[1],pd->width, pd->height, &xf,&yf);
+			Verts[vert_offset*2 + i * 2 + 0] = xf;
+			Verts[vert_offset*2 + i * 2 + 1] = yf;
+			if (plsp = (LANPR_LineStripPoint *)(lsp->Item.prev)) {
+				TotalLength += tMatDist2v(plsp->P, lsp->P);
+				Lengths[vert_offset + i] = TotalLength;
+			}
+			i++;
 		}
-		i++;
+		ls->total_length = TotalLength;
+
+		vert_offset+=(ls->point_count);
 	}
-	ls->total_length = TotalLength;
 
 	static Gwn_VertFormat format = { 0 };
 	static struct { uint pos, uvs; } attr_id;
@@ -483,14 +504,13 @@ Gwn_Batch *lanpr_get_snake_batch(LANPR_PrivateData* pd, LANPR_LineStrip* ls){
 	}
 
 	Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format);
-	GWN_vertbuf_data_alloc(vbo, Count);
+	GWN_vertbuf_data_alloc(vbo, v_count);
 
-	for (int i = 0; i < Count; ++i) {
+	for (int i = 0; i < v_count; ++i) {
 		GWN_vertbuf_attr_set(vbo, attr_id.pos, i, &Verts[i*2]);
 		GWN_vertbuf_attr_set(vbo, attr_id.uvs, i, &Lengths[i]);
 	}
 
-	MEM_freeN(Index_adjacent);
 	MEM_freeN(Verts);
 	MEM_freeN(Lengths);
 	
@@ -525,36 +545,49 @@ static void lanpr_draw_scene(void *vedata)
 
 	stl->g_data->znear = camera? ((Camera*)camera->data)->clipsta:0.1;
     stl->g_data->zfar = camera? ((Camera*)camera->data)->clipend:100;
-	stl->g_data->normal_clamp =    draw_ctx->scene->lanpr.normal_clamp;
-	stl->g_data->normal_strength = draw_ctx->scene->lanpr.normal_strength;
-	stl->g_data->depth_clamp =     draw_ctx->scene->lanpr.depth_clamp;
-	stl->g_data->depth_strength =  draw_ctx->scene->lanpr.depth_strength;
-
-	GPU_framebuffer_bind(fbl->edge_intermediate);
+	stl->g_data->normal_clamp =    lanpr->normal_clamp;
+	stl->g_data->normal_strength = lanpr->normal_strength;
+	stl->g_data->depth_clamp =     lanpr->depth_clamp;
+	stl->g_data->depth_strength =  lanpr->depth_strength;
 	//GPU_framebuffer_clear(fbl->edge_intermediate, clear_bits, clear_col, clear_depth, clear_stencil);
-	
-	DRW_draw_pass(psl->edge_intermediate);
-	
-    stl->g_data->stage = 0;
-    GPU_framebuffer_bind(fbl->edge_thinning);
-	clear_bits = GPU_COLOR_BIT;
-	GPU_framebuffer_clear(fbl->edge_thinning, clear_bits, clear_col, clear_depth, clear_stencil);
-    DRW_draw_pass(psl->edge_thinning);
-
-	stl->g_data->stage = 1;
 	GPU_framebuffer_bind(fbl->edge_intermediate);
-	//GPU_framebuffer_clear(fbl->edge_intermediate, clear_bits, clear_col, clear_depth, clear_stencil);
-    DRW_draw_pass(psl->edge_thinning_2);
+	DRW_draw_pass(psl->edge_intermediate);
 
-	stl->g_data->stage = 0;
-    GPU_framebuffer_bind(fbl->edge_thinning);
-	GPU_framebuffer_clear(fbl->edge_thinning, clear_bits, clear_col, clear_depth, clear_stencil);
-    DRW_draw_pass(psl->edge_thinning);
+	if((!lanpr->enable_vector_trace) && (!lanpr->display_thinning_result)){
+		GPU_framebuffer_bind(dfbl->default_fb);
+		DRW_transform_to_display(txl->edge_intermediate);
+		return;
+	}
 
-	stl->g_data->stage = 1;
-	GPU_framebuffer_bind(fbl->edge_intermediate);


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list