[Bf-blender-cvs] [923f59a984f] soc-2018-npr: DPIX normal controlled line width

Nick Wu noreply at git.blender.org
Sun Sep 16 09:35:59 CEST 2018


Commit: 923f59a984f80eb4f010366003b858c4558b4501
Author: Nick Wu
Date:   Sun Sep 16 15:35:41 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rB923f59a984f80eb4f010366003b858c4558b4501

DPIX normal controlled line width

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

M	release/scripts/startup/bl_ui/properties_scene.py
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_dpix_preview_geom.glsl

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

diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py
index 8e061c4e004..b14215fb8c5 100644
--- a/release/scripts/startup/bl_ui/properties_scene.py
+++ b/release/scripts/startup/bl_ui/properties_scene.py
@@ -675,15 +675,15 @@ class SCENE_PT_lanpr(SceneButtonsPanel, Panel):
                 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_control_object")
-                    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)
+            layout.label(text= "Normal:")
+            layout.prop(active_layer,"normal_mode", expand = True)
+            if active_layer.normal_mode != "DISABLED":
+                layout.prop(active_layer,"normal_control_object")
+                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")
diff --git a/source/blender/draw/engines/lanpr/lanpr_engine.c b/source/blender/draw/engines/lanpr/lanpr_engine.c
index d91fee3d10d..1c8c570a3b5 100644
--- a/source/blender/draw/engines/lanpr/lanpr_engine.c
+++ b/source/blender/draw/engines/lanpr/lanpr_engine.c
@@ -193,6 +193,8 @@ static void lanpr_engine_free(void){
 	stl->g_data = 0;
 }
 
+void lanpr_calculate_normal_object_vector(LANPR_LineLayer* ll, float* normal_object_direction);
+
 static void lanpr_cache_init(void *vedata){
 
 	LANPR_PassList *psl = ((LANPR_Data *)vedata)->psl;
@@ -201,6 +203,8 @@ static void lanpr_cache_init(void *vedata){
 
 	DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
 
+	static float normal_object_direction[3] = { 0,0,1 };
+
 	if (!stl->g_data) {
 		/* Alloc transient pointers */
 		stl->g_data = MEM_callocN(sizeof(*stl->g_data), __func__);
@@ -271,6 +275,8 @@ static void lanpr_cache_init(void *vedata){
 		stl->g_data->dpix_preview_shgrp = DRW_shgroup_create(lanpr_share.dpix_preview_shader, psl->dpix_preview_pass);
 		DRW_shgroup_uniform_texture_ref(stl->g_data->dpix_preview_shgrp, "vert0_tex", &txl->dpix_out_pl);
 		DRW_shgroup_uniform_texture_ref(stl->g_data->dpix_preview_shgrp, "vert1_tex", &txl->dpix_out_pr);
+		DRW_shgroup_uniform_texture_ref(stl->g_data->dpix_preview_shgrp, "face_normal0_tex", &txl->dpix_in_nl);
+		DRW_shgroup_uniform_texture_ref(stl->g_data->dpix_preview_shgrp, "face_normal1_tex", &txl->dpix_in_nr);// these are for normal shading
 		DRW_shgroup_uniform_texture_ref(stl->g_data->dpix_preview_shgrp, "edge_mask_tex", &txl->dpix_in_edge_mask);
 		DRW_shgroup_uniform_vec4(stl->g_data->dpix_preview_shgrp, "viewport", stl->g_data->dpix_viewport, 1);
 		DRW_shgroup_uniform_vec4(stl->g_data->dpix_preview_shgrp, "color", ll->color, 1);
@@ -293,6 +299,16 @@ static void lanpr_cache_init(void *vedata){
 		DRW_shgroup_uniform_float(stl->g_data->dpix_preview_shgrp, "z_near", &stl->g_data->dpix_znear, 1);
 		DRW_shgroup_uniform_float(stl->g_data->dpix_preview_shgrp, "z_far", &stl->g_data->dpix_zfar, 1);
 
+		lanpr_calculate_normal_object_vector(ll, normal_object_direction);
+
+		DRW_shgroup_uniform_int(stl->g_data->dpix_preview_shgrp, "normal_mode", &ll->normal_mode, 1);
+		DRW_shgroup_uniform_int(stl->g_data->dpix_preview_shgrp, "normal_effect_inverse", &ll->normal_effect_inverse, 1);
+		DRW_shgroup_uniform_float(stl->g_data->dpix_preview_shgrp, "normal_ramp_begin", &ll->normal_ramp_begin, 1);
+		DRW_shgroup_uniform_float(stl->g_data->dpix_preview_shgrp, "normal_ramp_end", &ll->normal_ramp_end, 1);
+		DRW_shgroup_uniform_float(stl->g_data->dpix_preview_shgrp, "normal_thickness_begin", &ll->normal_thickness_begin, 1);
+		DRW_shgroup_uniform_float(stl->g_data->dpix_preview_shgrp, "normal_thickness_end", &ll->normal_thickness_end, 1);
+		DRW_shgroup_uniform_vec3(stl->g_data->dpix_preview_shgrp, "normal_direction", normal_object_direction, 1);
+
 		pd->begin_index = 0;
 		int fsize = sizeof(float) * 4 * TNS_DPIX_TEXTURE_SIZE * TNS_DPIX_TEXTURE_SIZE;
 
diff --git a/source/blender/draw/engines/lanpr/lanpr_ops.c b/source/blender/draw/engines/lanpr/lanpr_ops.c
index 5f077d5e15f..d0c90ed1d40 100644
--- a/source/blender/draw/engines/lanpr/lanpr_ops.c
+++ b/source/blender/draw/engines/lanpr/lanpr_ops.c
@@ -3135,7 +3135,7 @@ void lanpr_software_draw_scene(void *vedata, GPUFrameBuffer *dfb, int is_render)
 	SceneLANPR *lanpr = &scene->lanpr;
 	View3D *v3d = draw_ctx->v3d;
 	float indentity_mat[4][4];
-	float normal_object_direction[3] = { 0,0,1 };
+	static float normal_object_direction[3] = { 0,0,1 };
 
 	if (is_render) {
 		lanpr_rebuild_all_command(lanpr);
diff --git a/source/blender/draw/engines/lanpr/shaders/lanpr_dpix_preview_geom.glsl b/source/blender/draw/engines/lanpr/shaders/lanpr_dpix_preview_geom.glsl
index a9820014817..192ebb2a3af 100644
--- a/source/blender/draw/engines/lanpr/shaders/lanpr_dpix_preview_geom.glsl
+++ b/source/blender/draw/engines/lanpr/shaders/lanpr_dpix_preview_geom.glsl
@@ -3,6 +3,8 @@ layout(triangle_strip, max_vertices = 6) out;
 
 uniform sampler2D vert0_tex;//L
 uniform sampler2D vert1_tex;//R
+uniform sampler2D face_normal0_tex;
+uniform sampler2D face_normal1_tex;// caution: these are face normals!
 uniform sampler2D edge_mask_tex;
 
 //uniform float uValue0; // buffer_w
@@ -31,6 +33,15 @@ uniform float line_thickness_material;
 uniform float line_thickness_edge_mark;
 uniform float line_thickness_intersection;
 
+// the same as software mode
+uniform int normal_mode;
+uniform int normal_effect_inverse;
+uniform vec3 normal_direction; // also used as point position
+uniform float normal_ramp_begin;
+uniform float normal_ramp_end;
+uniform float normal_thickness_begin;
+uniform float normal_thickness_end;
+
 float use_thickness;
 
 out vec4 out_color;
@@ -94,23 +105,50 @@ void draw_line(vec4 p1, vec4 p2, int is_crease){
 	EndPrimitive();
 }
 
+float factor_to_thickness(float factor){
+	float r = (factor - normal_ramp_begin)/(normal_ramp_end - normal_ramp_begin);
+	if(r>1) r=1;
+	if(r<0) r=0;
+	float thickness = normal_effect_inverse==1 ?
+					  mix(normal_thickness_begin,normal_thickness_end,r) :
+					  mix(normal_thickness_end,normal_thickness_begin,r);
+	return thickness;
+}
+
 void main() {
 	vec4 p1 = texelFetch(vert0_tex, ivec2(gl_in[0].gl_Position.xy), 0);
 	vec4 p2 = texelFetch(vert1_tex, ivec2(gl_in[0].gl_Position.xy), 0);
 
+	vec4 n1 = texelFetch(face_normal0_tex, ivec2(gl_in[0].gl_Position.xy), 0);
+	vec4 n2 = texelFetch(face_normal1_tex, ivec2(gl_in[0].gl_Position.xy), 0);
+
+	vec3 use_normal = normalize(mix(n1,n2,0.5).xyz);
+
 	if (p1.w == 0 && p2.w == 0) return;
 
 	vec4 edge_mask = texelFetch(edge_mask_tex, ivec2(gl_in[0].gl_Position.xy), 0);
 
 	int is_crease = 0;
 
-	use_thickness = line_thickness;
 	use_color = color;
 
-	if (edge_mask.g > 0)      { use_color = edge_mark_color;     use_thickness = line_thickness * line_thickness_edge_mark; }
-	else if (edge_mask.r > 0) { use_color = material_color;      use_thickness = line_thickness * line_thickness_material;  }
-	else if (edge_mask.b > 0) { use_color = intersection_color;  use_thickness = line_thickness * line_thickness_intersection;  }
-	else if (p2.w != p1.w)    { use_color = crease_color;        use_thickness = line_thickness * line_thickness_crease; is_crease = 1; }
+	float th=line_thickness;
+	if(normal_mode == 0){
+		th=line_thickness;
+	}else if(normal_mode == 1){
+		float factor = dot(use_normal,normal_direction);
+		th = factor_to_thickness(factor);
+	}else if(normal_mode == 2){
+		float factor = dot(use_normal,normal_direction);
+		th = factor_to_thickness(factor);
+	}
+
+    use_thickness = th;
+	
+	if (edge_mask.g > 0)      { use_color = edge_mark_color;     use_thickness = th * line_thickness_edge_mark; }
+	else if (edge_mask.r > 0) { use_color = material_color;      use_thickness = th * line_thickness_material;  }
+	else if (edge_mask.b > 0) { use_color = intersection_color;  use_thickness = th * line_thickness_intersection;  }
+	else if (p2.w != p1.w)    { use_color = crease_color;        use_thickness = th * line_thickness_crease; is_crease = 1; }
 
 	draw_line(p1, p2, is_crease);
 }
\ No newline at end of file



More information about the Bf-blender-cvs mailing list