[Bf-blender-cvs] [6b005517db9] soc-2018-npr: Normal controlled normal thickness for software is ok. No direction and position variation.

Nick Wu noreply at git.blender.org
Tue Aug 28 12:11:42 CEST 2018


Commit: 6b005517db982b3036d86a5cdbb8ab91abc598f2
Author: Nick Wu
Date:   Tue Aug 28 15:48:01 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rB6b005517db982b3036d86a5cdbb8ab91abc598f2

Normal controlled normal thickness for software is ok. No direction and position variation.

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

M	release/scripts/startup/bl_ui/properties_scene.py
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_ops.c
M	source/blender/draw/engines/lanpr/shaders/lanpr_software_chain_geom.glsl
M	source/blender/draw/engines/lanpr/shaders/lanpr_software_line_chain_geom.glsl
M	source/blender/makesdna/DNA_lanpr_types.h
M	source/blender/makesrna/intern/rna_lanpr.c

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

diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py
index e90e8f4b890..461f1f7db71 100644
--- a/release/scripts/startup/bl_ui/properties_scene.py
+++ b/release/scripts/startup/bl_ui/properties_scene.py
@@ -672,6 +672,16 @@ class SCENE_PT_lanpr(SceneButtonsPanel, Panel):
                     layout.operator("scene.lanpr_rebuild_all_commands")
                 else:
                     layout.operator("scene.lanpr_add_line_layer")
+
+                layout.label(text= "Normal:")
+                layout.prop(active_layer,"normal_mode", expand = True)
+                if active_layer.normal_mode != "DISABLED":
+                    layout.prop(active_layer,"normal_effect_inverse", toggle = True)
+                    layout.prop(active_layer,"normal_ramp_begin")
+                    layout.prop(active_layer,"normal_ramp_end")
+                    layout.prop(active_layer,"normal_thickness_begin", slider=True)
+                    layout.prop(active_layer,"normal_thickness_end", slider=True)
+
             elif not lanpr.layers.active_layer:
                 layout.operator("scene.lanpr_add_line_layer")
             
@@ -734,9 +744,6 @@ class SCENE_PT_lanpr_line_types(SceneButtonsPanel, Panel):
         else:
             row.label(text= "Intersection Calculation Disabled")
 
-        layout.label(text= "Normal:")
-        layout.prop(active_layer,"normal_mode", expand = True)
-
         if lanpr.master_mode == "DPIX" and active_layer.enable_intersection:
             row = col.row(align = True)
             row.prop(lanpr,"enable_intersections", toggle = True, text = "Enable")
diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index 460d3d1aad2..c0b72bdbac0 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -482,6 +482,7 @@ typedef struct LANPR_RenderLineChain {
 typedef struct LANPR_RenderLineChainItem {
 	nListItem Item;
 	float pos[3];       // need z value for fading
+	float normal[3];
 	char LineType;             //      style of [1]       style of [2]
 	char OcclusionLevel;         // [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 f0b53e9ee9f..236df7e7324 100644
--- a/source/blender/draw/engines/lanpr/lanpr_chain.c
+++ b/source/blender/draw/engines/lanpr/lanpr_chain.c
@@ -80,12 +80,13 @@ LANPR_RenderLineChain *lanpr_create_render_line_chain(LANPR_RenderBuffer *rb){
 	return rlc;
 }
 
-LANPR_RenderLineChainItem *lanpr_append_render_line_chain_point(LANPR_RenderBuffer *rb, LANPR_RenderLineChain *rlc, float x, float y, char type, int level){
+LANPR_RenderLineChainItem *lanpr_append_render_line_chain_point(LANPR_RenderBuffer *rb, LANPR_RenderLineChain *rlc, float x, float y, float* normal, char type, int level){
 	LANPR_RenderLineChainItem *rlci;
 	rlci = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineChainItem));
 
 	rlci->pos[0] = x;
 	rlci->pos[1] = y;
+	copy_v3_v3(rlci->normal, normal);
 	rlci->LineType = type & LANPR_EDGE_FLAG_ALL_TYPE;
 	rlci->OcclusionLevel = level;
 	BLI_addtail(&rlc->Chain, rlci);
@@ -95,12 +96,13 @@ LANPR_RenderLineChainItem *lanpr_append_render_line_chain_point(LANPR_RenderBuff
 	return rlci;
 }
 
-LANPR_RenderLineChainItem *lanpr_push_render_line_chain_point(LANPR_RenderBuffer *rb, LANPR_RenderLineChain *rlc, float x, float y, char type, int level){
+LANPR_RenderLineChainItem *lanpr_push_render_line_chain_point(LANPR_RenderBuffer *rb, LANPR_RenderLineChain *rlc, float x, float y, float* normal, char type, int level){
 	LANPR_RenderLineChainItem *rlci;
 	rlci = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineChainItem));
 
 	rlci->pos[0] = x;
 	rlci->pos[1] = y;
+	copy_v3_v3(rlci->normal, normal);
 	rlci->LineType = type & LANPR_EDGE_FLAG_ALL_TYPE;
 	rlci->OcclusionLevel = level;
 	BLI_addhead(&rlc->Chain, rlci);
@@ -161,23 +163,53 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_thre
 		int r1, r2, c1, c2, row, col;
 		LANPR_RenderLine *new_rl = rl;
 		LANPR_RenderVert *new_rv;
+		float N[3] = { 0 };
+
+		if (rl->TL) {
+			N[0] += rl->TL->GN[0];
+			N[1] += rl->TL->GN[1];
+			N[2] += rl->TL->GN[2];
+		}
+		if (rl->TR) {
+			N[0] += rl->TR->GN[0];
+			N[1] += rl->TR->GN[1];
+			N[2] += rl->TR->GN[2];
+		}
+		if (rl->TL || rl->TR) {
+			normalize_v3(N);
+		}
 
 		// step 1: grow left
 		ba = lanpr_get_point_bounding_area(rb, rl->L->FrameBufferCoord[0], rl->L->FrameBufferCoord[1]);
 		new_rv = rl->L;
 		rls = rl->Segments.first;
-		lanpr_push_render_line_chain_point(rb, rlc, new_rv->FrameBufferCoord[0], new_rv->FrameBufferCoord[1], rl->Flags, rls->OcclusionLevel);
+		lanpr_push_render_line_chain_point(rb, rlc, new_rv->FrameBufferCoord[0], new_rv->FrameBufferCoord[1], N, rl->Flags, rls->OcclusionLevel);
 		while (ba && (new_rl = lanpr_get_connected_render_line(ba, new_rv, &new_rv))) {
 			new_rl->Flags |= LANPR_EDGE_FLAG_CHAIN_PICKED;
 
 			int last_occlusion;
 
+			N[0] = N[1] = N[2] = 0;
+			if (new_rl->TL) {
+				N[0] += new_rl ->TL->GN[0];
+				N[1] += new_rl ->TL->GN[1];
+				N[2] += new_rl ->TL->GN[2];
+			}
+			if (new_rl->TR) {
+				N[0] += new_rl->TR->GN[0];
+				N[1] += new_rl->TR->GN[1];
+				N[2] += new_rl->TR->GN[2];
+			}
+			if (rl->TL || rl->TR) {
+				normalize_v3(N);
+			}
+
 			if (new_rv == new_rl->L) {
 				for (rls = new_rl->Segments.last; rls; rls = rls->Item.pPrev) {
 					float px, py;
 					px = tnsLinearItp(new_rl->L->FrameBufferCoord[0], new_rl->R->FrameBufferCoord[0], rls->at);
 					py = tnsLinearItp(new_rl->L->FrameBufferCoord[1], new_rl->R->FrameBufferCoord[1], rls->at);
-					lanpr_push_render_line_chain_point(rb, rlc, px, py, new_rl->Flags, rls->OcclusionLevel);
+					lanpr_push_render_line_chain_point(rb, rlc, px, py, N, new_rl->Flags, rls->OcclusionLevel);
 				}
 			} elif(new_rv == new_rl->R)
 			{
@@ -188,10 +220,10 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_thre
 					float px, py;
 					px = tnsLinearItp(new_rl->L->FrameBufferCoord[0], new_rl->R->FrameBufferCoord[0], rls->at);
 					py = tnsLinearItp(new_rl->L->FrameBufferCoord[1], new_rl->R->FrameBufferCoord[1], rls->at);
-					lanpr_push_render_line_chain_point(rb, rlc, px, py, new_rl->Flags, last_occlusion);
+					lanpr_push_render_line_chain_point(rb, rlc, px, py, N, new_rl->Flags, last_occlusion);
 					last_occlusion = rls->OcclusionLevel;
 				}
-				lanpr_push_render_line_chain_point(rb, rlc, new_rl->R->FrameBufferCoord[0], new_rl->R->FrameBufferCoord[1], new_rl->Flags, last_occlusion);
+				lanpr_push_render_line_chain_point(rb, rlc, new_rl->R->FrameBufferCoord[0], new_rl->R->FrameBufferCoord[1], N, new_rl->Flags, last_occlusion);
 			}
 			ba = lanpr_get_point_bounding_area(rb, new_rv->FrameBufferCoord[0], new_rv->FrameBufferCoord[1]);
 		}
@@ -202,9 +234,9 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_thre
 			float px, py;
 			px = tnsLinearItp(rl->L->FrameBufferCoord[0], rl->R->FrameBufferCoord[0], rls->at);
 			py = tnsLinearItp(rl->L->FrameBufferCoord[1], rl->R->FrameBufferCoord[1], rls->at);
-			lanpr_append_render_line_chain_point(rb, rlc, px, py, rl->Flags, rls->OcclusionLevel);
+			lanpr_append_render_line_chain_point(rb, rlc, px, py, N, rl->Flags, rls->OcclusionLevel);
 		}
-		lanpr_append_render_line_chain_point(rb, rlc, rl->R->FrameBufferCoord[0], rl->R->FrameBufferCoord[1], rl->Flags, 0);
+		lanpr_append_render_line_chain_point(rb, rlc, rl->R->FrameBufferCoord[0], rl->R->FrameBufferCoord[1], N, rl->Flags, 0);
 
 		// step 3: grow right
 		ba = lanpr_get_point_bounding_area(rb, rl->R->FrameBufferCoord[0], rl->R->FrameBufferCoord[1]);
@@ -231,7 +263,7 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_thre
 					px = tnsLinearItp(new_rl->L->FrameBufferCoord[0], new_rl->R->FrameBufferCoord[0], rls->at);
 					py = tnsLinearItp(new_rl->L->FrameBufferCoord[1], new_rl->R->FrameBufferCoord[1], rls->at);
 					last_occlusion = rls->Item.pPrev ? ((LANPR_RenderLineSegment *)rls->Item.pPrev)->OcclusionLevel : 0;
-					lanpr_append_render_line_chain_point(rb, rlc, px, py, new_rl->Flags, last_occlusion);
+					lanpr_append_render_line_chain_point(rb, rlc, px, py, N, new_rl->Flags, last_occlusion);
 				}
 			} elif(new_rv == new_rl->R)
 			{
@@ -243,10 +275,10 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_thre
 					float px, py;
 					px = tnsLinearItp(new_rl->L->FrameBufferCoord[0], new_rl->R->FrameBufferCoord[0], rls->at);
 					py = tnsLinearItp(new_rl->L->FrameBufferCoord[1], new_rl->R->FrameBufferCoord[1], rls->at);
-					lanpr_append_render_line_chain_point(rb, rlc, px, py, new_rl->Flags, rls->OcclusionLevel);
+					lanpr_append_render_line_chain_point(rb, rlc, px, py, N, new_rl->Flags, rls->OcclusionLevel);
 					//last_occlusion = rls->OcclusionLevel;
 				}
-				lanpr_append_render_line_chain_point(rb, rlc, new_rl->R->FrameBufferCoord[0], new_rl->R->FrameBufferCoord[1], new_rl->Flags, 0);
+				lanpr_append_render_line_chain_point(rb, rlc, new_rl->R->FrameBufferCoord[0], new_rl->R->FrameBufferCoord[1], N, new_rl->Flags, 0);
 			}
 			ba = lanpr_get_point_bounding_area(rb, new_rv->FrameBufferCoord[0], new_rv->FrameBufferCoord[1]);
 		}
@@ -312,10 +344,11 @@ void lanpr_chain_generate_draw_command(LANPR_RenderBuffer *rb){
 	float length_target[2];
 
 	static GPUVertFormat format = { 0 };
-	static struct { uint pos, uvs, type, level; } attr_id;
+	static struct { uint pos, uvs, normal, type, level; } attr_id;
 	if (format.attr_len == 0) {
 		attr_id.pos = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
 		attr_id.uvs = GPU_vertformat_attr_add(&format, "uvs", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+		attr_id.normal = GPU_vertformat_attr_add(&format, "normal", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
 		attr_id.type = GPU_vertformat_attr_add(&format, "type", GPU_COMP_I32, 1, GPU_FETCH_INT);
 		attr_id.level = GPU_vertformat_attr_add(&format, "level", GPU_COMP_I32, 1, GPU_FETCH_INT);
 	}
@@ -345,

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list