[Bf-blender-cvs] [b421eaa36d8] soc-2018-npr: Chain first level preview ok. Simplification have bugs.

Nick Wu noreply at git.blender.org
Fri Jul 20 15:07:11 CEST 2018


Commit: b421eaa36d88d38988165176fe07a85b91edb7cd
Author: Nick Wu
Date:   Fri Jul 20 21:06:36 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rBb421eaa36d88d38988165176fe07a85b91edb7cd

Chain first level preview ok. Simplification have bugs.

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

M	source/blender/draw/engines/lanpr/lanpr_all.h
M	source/blender/draw/engines/lanpr/lanpr_chain.c
M	source/blender/draw/engines/lanpr/lanpr_engine.c
M	source/blender/draw/engines/lanpr/lanpr_ops.c
M	source/blender/draw/engines/lanpr/shaders/lanpr_software_line_width.geometry
M	source/blender/draw/engines/lanpr/shaders/lanpr_software_scale_compensate.vertex
M	source/blender/makesdna/DNA_lanpr_types.h

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

diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index d5a24d758e6..158a9057ef3 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -467,11 +467,12 @@ typedef struct LANPR_RenderLineChain {
 	nListItem   Item;
 	nListHandle Chain;
 	//int         SegmentCount;  // we count before draw cmd.
+	float       Length;          // calculated before draw cmd.
 }LANPR_RenderLineChain;
 
 typedef struct LANPR_RenderLineChainItem {
 	nListItem   Item;
-	float       pos[2];
+	float       pos[3]; // need z value for fading
 	char        LineType;      //      style of [1]       style of [2]
 	char        OccludeLevel;  // [1]--------------->[2]---------------->[3]--....
 }LANPR_RenderLineChainItem;
diff --git a/source/blender/draw/engines/lanpr/lanpr_chain.c b/source/blender/draw/engines/lanpr/lanpr_chain.c
index c592c373cc1..834a458eb98 100644
--- a/source/blender/draw/engines/lanpr/lanpr_chain.c
+++ b/source/blender/draw/engines/lanpr/lanpr_chain.c
@@ -87,6 +87,8 @@ LANPR_RenderLineChainItem* lanpr_append_render_line_chain_point(LANPR_RenderBuff
     rlci->LineType = type&LANPR_EDGE_FLAG_ALL_TYPE;
     lstAppendItem(&rlc->Chain,rlci);
 
+	//printf("a %f %f\n", x, y);
+
     return rlci;
 }
 
@@ -99,6 +101,8 @@ LANPR_RenderLineChainItem* lanpr_push_render_line_chain_point(LANPR_RenderBuffer
     rlci->LineType = type&LANPR_EDGE_FLAG_ALL_TYPE;
     lstPushItem(&rlc->Chain,rlci);
 
+	//printf("p %f %f\n", x, y);
+
     return rlci;
 }
 
@@ -155,7 +159,7 @@ void lanpr_ChainFeatureLines_NO_THREAD(LANPR_RenderBuffer *rb, float dist_thresh
         ba = lanpr_GetPointBoundingArea(rb,rl->L->FrameBufferCoord[0], rl->L->FrameBufferCoord[1]);
         new_rv = rl->L;
         lanpr_push_render_line_chain_point(rb,rlc,new_rv->FrameBufferCoord[0],new_rv->FrameBufferCoord[1],rl->Flags,0);
-        while(new_rl = lanpr_GetConnectedRenderLine(ba,new_rv,&new_rv)){
+        while(ba &&(new_rl = lanpr_GetConnectedRenderLine(ba,new_rv,&new_rv))){
             new_rl->Flags |= LANPR_EDGE_FLAG_CHAIN_PICKED;
 
             int last_occlude;
@@ -198,7 +202,7 @@ void lanpr_ChainFeatureLines_NO_THREAD(LANPR_RenderBuffer *rb, float dist_thresh
         new_rv = rl->R;
         // below already done in step 2
         // lanpr_push_render_line_chain_point(rb,rlc,new_rv->FrameBufferCoord[0],new_rv->FrameBufferCoord[1],rl->Flags,0);
-        while(new_rl = lanpr_GetConnectedRenderLine(ba,new_rv,&new_rv)){
+        while(ba && (new_rl = lanpr_GetConnectedRenderLine(ba,new_rv,&new_rv))){
             new_rl->Flags |= LANPR_EDGE_FLAG_CHAIN_PICKED;
 
             int last_occlude;
@@ -226,11 +230,18 @@ void lanpr_ChainFeatureLines_NO_THREAD(LANPR_RenderBuffer *rb, float dist_thresh
 			ba = lanpr_GetPointBoundingArea(rb, new_rv->FrameBufferCoord[0], new_rv->FrameBufferCoord[1]);
         }
 
+		//LANPR_RenderLineChainItem* rlci;
+		//printf("line:\n");
+		//for (rlci = rlc->Chain.pFirst; rlci; rlci = rlci->Item.pNext) {
+		//	printf("  %f %f\n", rlci->pos[0],rlci->pos[1]);
+		//}
+		//printf("--------\n");
+
         //lanpr_reduce_render_line_chain_recursive(rlc,rlc->Chain.pFirst, rlc->Chain.pLast, dist_threshold);
     }
 }
 
-int lanpr_CountChainVertices(LANPR_RenderLineChain* rlc){
+int lanpr_CountChain(LANPR_RenderLineChain* rlc){
     LANPR_RenderLineChainItem* rlci;
     int Count = 0;
 	for (rlci = rlc->Chain.pFirst; rlci; rlci = rlci->Item.pNext) {
@@ -239,19 +250,39 @@ int lanpr_CountChainVertices(LANPR_RenderLineChain* rlc){
     return Count;
 }
 
+float lanpr_ComputeChainLength(LANPR_RenderLineChain* rlc, float* lengths, int begin_index) {
+	LANPR_RenderLineChainItem* rlci;
+	int i=0;
+	float offset_accum = 0;
+	float dist;
+	float last_point[2];
+
+	rlci = rlc->Chain.pFirst;
+	copy_v2_v2(last_point, rlci->pos);
+	for (rlci = rlc->Chain.pFirst; rlci; rlci = rlci->Item.pNext) {
+		dist = len_v2v2(rlci->pos, last_point);
+		offset_accum += dist;
+		lengths[begin_index + i] = offset_accum;
+		copy_v2_v2(last_point, rlci->pos);
+		i++;
+	}
+	return offset_accum;
+}
+
 void lanpr_ChainGenerateDrawCommand(LANPR_RenderBuffer *rb){
     LANPR_RenderLineChain* rlc;
     LANPR_RenderLineChainItem* rlci;
-    int vert_count;
+    int vert_count=0;
     int i=0;
-    float last_point[2];
-    float offset_accum=0;
+    float total_length;
+	float* lengths;
+	float length_target[2];
 
     static Gwn_VertFormat format = { 0 };
 	static struct { uint pos, offset, type, level; } attr_id;
 	if (format.attr_len == 0) {
 		attr_id.pos = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
-        attr_id.offset = GWN_vertformat_attr_add(&format, "offset", GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
+        attr_id.offset = GWN_vertformat_attr_add(&format, "uvs", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
 		attr_id.type = GWN_vertformat_attr_add(&format, "type", GWN_COMP_I32, 1, GWN_FETCH_FLOAT);
 		attr_id.level = GWN_vertformat_attr_add(&format, "level", GWN_COMP_I32, 1, GWN_FETCH_INT);
 	}
@@ -259,35 +290,55 @@ void lanpr_ChainGenerateDrawCommand(LANPR_RenderBuffer *rb){
 	Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format);
 
     for(rlc = rb->Chains.pFirst; rlc;rlc=rlc->Item.pNext){
-		int count = lanpr_CountChainVertices(rlc);
+		int count = lanpr_CountChain(rlc);
 		printf("seg contains %d verts\n", count);
 		vert_count += count;
     }
 
-    GWN_vertbuf_data_alloc(vbo, vert_count);
+    GWN_vertbuf_data_alloc(vbo, vert_count+1); // serve as end point's adj.
 
-    //Gwn_IndexBufBuilder elb;
-	//GWN_indexbuf_init_ex(&elb, GWN_PRIM_LINES_ADJ, vert_count, vert_count, true);// elem count will not exceed vert_count (even including prim_restart)
+	lengths = MEM_callocN(sizeof(float)*vert_count, "chain lengths");
+
+    Gwn_IndexBufBuilder elb;
+	GWN_indexbuf_init_ex(&elb, GWN_PRIM_LINES_ADJ, vert_count*4, vert_count, true);// elem count will not exceed vert_count
+
+	int debc = 0;
 
     for(rlc = rb->Chains.pFirst; rlc; rlc=rlc->Item.pNext){
-		rlci = rlc->Chain.pFirst;
-        copy_v2_v2(last_point, rlci->pos);
-		for (rlci; rlci; rlci = rlci->Item.pNext) {
+		//if (debc == 1) break;
+		debc++;
+
+		total_length = lanpr_ComputeChainLength(rlc, lengths, i);
+
+		for (rlci = rlc->Chain.pFirst; rlci; rlci = rlci->Item.pNext) {
+
+			length_target[0] = lengths[i];
+			length_target[1] = total_length - lengths[i];
 
             GWN_vertbuf_attr_set(vbo, attr_id.pos, i, rlci->pos);
-            GWN_vertbuf_attr_set(vbo, attr_id.offset, i, &offset_accum);
+            GWN_vertbuf_attr_set(vbo, attr_id.offset, i, length_target);
 
-            offset_accum += len_v2v2(rlci->pos,last_point);
-            copy_v2_v2(last_point, rlci->pos);
+			if (rlci == rlc->Chain.pLast) { i++; continue; }
 
-            //if(i==0)GWN_indexbuf_add_line_adj_verts(&elb, 0, 0, 1, 2);
-            //elif(i==vert_count-2)GWN_indexbuf_add_line_adj_verts(&elb, i-1, i, i+1, i+1);
-            //elif(i<vert_count-2)GWN_indexbuf_add_line_adj_verts(&elb, i-1, i, i+1, i+2);
+			if (rlci == rlc->Chain.pFirst) {
+				if (rlci->Item.pNext == rlc->Chain.pLast) GWN_indexbuf_add_line_adj_verts(&elb, vert_count, i, i + 1, vert_count);
+				else GWN_indexbuf_add_line_adj_verts(&elb, vert_count, i, i + 1, i + 2);
+			}
+			else {
+				if (rlci->Item.pNext == rlc->Chain.pLast) GWN_indexbuf_add_line_adj_verts(&elb, i-1, i, i + 1, vert_count);
+				else GWN_indexbuf_add_line_adj_verts(&elb, i-1, i, i + 1, i + 2);
+			}
 
-            i++;
+			i++;
         }
     }
+	//set end point flag value.
+	length_target[0] = 3e30f;
+	length_target[1] = 3e30f;
+	GWN_vertbuf_attr_set(vbo, attr_id.pos, vert_count, length_target);
+
+	MEM_freeN(lengths);
 
-    rb->ChainDrawBatch = GWN_batch_create_ex(GWN_PRIM_LINE_STRIP, vbo, 0, GWN_USAGE_DYNAMIC | GWN_BATCH_OWNS_VBO);
+    rb->ChainDrawBatch = GWN_batch_create_ex(GWN_PRIM_LINES_ADJ, vbo, GWN_indexbuf_build(&elb), GWN_USAGE_DYNAMIC | GWN_BATCH_OWNS_VBO);
 
 }
\ No newline at end of file
diff --git a/source/blender/draw/engines/lanpr/lanpr_engine.c b/source/blender/draw/engines/lanpr/lanpr_engine.c
index e2576d691af..7f27bb06ee1 100644
--- a/source/blender/draw/engines/lanpr/lanpr_engine.c
+++ b/source/blender/draw/engines/lanpr/lanpr_engine.c
@@ -348,27 +348,7 @@ static void lanpr_cache_init(void *vedata){
 		}
 	} elif(lanpr->master_mode == LANPR_MASTER_MODE_SOFTWARE)
 	{
-		psl->software_pass = DRW_pass_create("Software Render Preview",  DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL);
-		lanpr->render_buffer->ChainShgrp = DRW_shgroup_create(OneTime.software_shader, psl->software_pass);
-		if (lanpr->render_buffer->ChainDrawBatch){
-			LANPR_LineLayer *ll;
-			for (ll = lanpr->line_layers.first; ll; ll = ll->next) {
-				ll->shgrp = DRW_shgroup_create(OneTime.software_shader, psl->software_pass);
-				DRW_shgroup_uniform_vec4(ll->shgrp, "color", ll->color, 1);
-				DRW_shgroup_uniform_vec4(ll->shgrp, "crease_color", ll->crease_color, 1);
-				DRW_shgroup_uniform_vec4(ll->shgrp, "material_color", ll->material_color, 1);
-				DRW_shgroup_uniform_vec4(ll->shgrp, "edge_mark_color", ll->edge_mark_color, 1);
-				DRW_shgroup_uniform_vec4(ll->shgrp, "intersection_color", ll->intersection_color, 1);
-				DRW_shgroup_uniform_float(ll->shgrp, "thickness_crease", &ll->thickness_crease, 1);
-				DRW_shgroup_uniform_float(ll->shgrp, "thickness_material", &ll->thickness_material, 1);
-				DRW_shgroup_uniform_float(ll->shgrp, "thickness_edge_mark", &ll->thickness_edge_mark, 1);
-				DRW_shgroup_uniform_float(ll->shgrp, "thickness_intersection", &ll->thickness_intersection, 1);
-				DRW_shgroup_uniform_vec4(ll->shgrp, "preview_viewport", stl->g_data->dpix_viewport, 1);
-				DRW_shgroup_uniform_vec4(ll->shgrp, "output_viewport", stl->g_data->output_viewport, 1);
-				DRW_shgroup_uniform_float(ll->shgrp, "thickness", &ll->thickness, 1);
-				DRW_shgroup_call_add(ll->shgrp, lanpr->render_buffer->ChainDrawBatch, NULL);
-			}
-		}
+		;
 		/*LANPR_LineLayer *ll;
 		for (ll = lanpr->line_layers.first; ll; ll = ll->next) {
 			ll->shgrp = DRW_shgroup_create(OneTime.software_shader, psl->software_pass);
@@ -502,21 +482,51 @@ static void lanpr_draw_scene_exec(v

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list