[Bf-blender-cvs] [d64862f778b] soc-2018-npr: Add: depth controlled line width.

Nick Wu noreply at git.blender.org
Mon Jun 11 09:03:03 CEST 2018


Commit: d64862f778b7ce2379342d65c30accda2196f93d
Author: Nick Wu
Date:   Mon Jun 11 14:02:36 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rBd64862f778b7ce2379342d65c30accda2196f93d

Add: depth controlled line width.

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

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_dpix.c
M	source/blender/draw/engines/lanpr/lanpr_engine.c
M	source/blender/draw/engines/lanpr/shaders/lanpr_atlas_preview.geometry
M	source/blender/draw/engines/lanpr/shaders/lanpr_atlas_project_clip.fragment
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager_texture.c
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 4a322d0670c..88e44b95bed 100644
--- a/release/scripts/startup/bl_ui/properties_scene.py
+++ b/release/scripts/startup/bl_ui/properties_scene.py
@@ -493,11 +493,20 @@ class SCENE_PT_lanpr(SceneButtonsPanel, PropertyPanel, Panel):
         if lanpr.master_mode == "DPIX":
             layout.label(text="DPIX:")
             layout.prop(lanpr, "reloaded")
+            
             split = layout.split()
             col = split.column()
             col.prop(lanpr, "background_color")
             col = split.column()
             col.prop(lanpr, "line_color")
+
+            layout.label(text="Effect Settings:")
+            layout.prop(lanpr, "line_thickness")
+            split = layout.split()
+            col = split.column()
+            col.prop(lanpr, "depth_influence")
+            col = split.column()
+            col.prop(lanpr, "depth_curve")
             
         else:
             layout.label(text="Snake:")
@@ -524,6 +533,12 @@ class SCENE_PT_lanpr(SceneButtonsPanel, PropertyPanel, Panel):
 
                 layout.label(text="Effect Settings:")
 
+                split = layout.split()
+                col = split.column()
+                col.prop(lanpr, "depth_influence")
+                col = split.column()
+                col.prop(lanpr, "depth_curve")
+
                 layout.prop(lanpr, "use_same_taper")
 
                 if lanpr.use_same_taper == "DISABLED":
diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index 8e7acae20c6..f299ccba0ee 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -166,6 +166,9 @@ typedef struct LANPR_PrivateData {
     int           dpix_buffer_width;
 	float         dpix_depth_offset;
 
+	float         dpix_znear;
+	float         dpix_zfar;
+
 	// drawing
 
 	unsigned        v_buf;
diff --git a/source/blender/draw/engines/lanpr/lanpr_dpix.c b/source/blender/draw/engines/lanpr/lanpr_dpix.c
index 2eae86b3242..791a8296815 100644
--- a/source/blender/draw/engines/lanpr/lanpr_dpix.c
+++ b/source/blender/draw/engines/lanpr/lanpr_dpix.c
@@ -263,6 +263,11 @@ void lanpr_dpix_draw_scene(LANPR_TextureList* txl, LANPR_FramebufferList * fbl,
 
         int texw = GPU_texture_width(txl->edge_intermediate) ,texh = GPU_texture_height(txl->edge_intermediate);;
 	    int tsize = texw*texh;
+
+		const DRWContextState *draw_ctx = DRW_context_state_get();
+		View3D *v3d = draw_ctx->v3d;
+	    RegionView3D *rv3d = draw_ctx->rv3d;
+	    Object *camera = (rv3d->persp == RV3D_CAMOB) ? v3d->camera : NULL;
         
         pd->dpix_viewport[2] = texw;
 		pd->dpix_viewport[3] = texh;
@@ -270,6 +275,8 @@ void lanpr_dpix_draw_scene(LANPR_TextureList* txl, LANPR_FramebufferList * fbl,
 		pd->dpix_sample_step = 1;
 		pd->dpix_buffer_width = TNS_DPIX_TEXTURE_SIZE;
 		pd->dpix_depth_offset=0.0001;
+		pd->dpix_znear = camera?((Camera*)camera->data)->clipsta:v3d->near;
+		pd->dpix_zfar = camera?((Camera*)camera->data)->clipend:v3d->far;
 
         glPointSize(1);
 		glLineWidth(2);
@@ -280,18 +287,18 @@ void lanpr_dpix_draw_scene(LANPR_TextureList* txl, LANPR_FramebufferList * fbl,
 		//GPU_framebuffer_bind(fbl->edge_intermediate);
 		//DRW_draw_pass(psl->color_pass);// use depth
 
-		glEnable(GL_LINE_SMOOTH);
-        glHint(GL_LINE_SMOOTH, GL_NICEST);
-	    glEnable(GL_BLEND);
-        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+		//glEnable(GL_POLYGON_SMOOTH);
+        //glHint(GL_POLYGON_SMOOTH, GL_NICEST);
+	    //glEnable(GL_BLEND);
+        //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
 		GPU_framebuffer_bind(fbl->dpix_preview);
 		GPUFrameBufferBits clear_bits = GPU_COLOR_BIT;
 		GPU_framebuffer_clear(fbl->dpix_preview, clear_bits, lanpr->background_color, clear_depth, clear_stencil);
 		DRW_draw_pass(psl->dpix_preview_pass);
 
-		glDisable(GL_LINE_SMOOTH);
-		glDisable(GL_BLEND);
+		//glDisable(GL_POLYGON_SMOOTH);
+		//glDisable(GL_BLEND);
 
 		GPU_framebuffer_bind(dfbl->default_fb);
 		//DRW_transform_to_display(txl->dpix_out_pl);
diff --git a/source/blender/draw/engines/lanpr/lanpr_engine.c b/source/blender/draw/engines/lanpr/lanpr_engine.c
index 1aa0d56b7b6..8d7045494f3 100644
--- a/source/blender/draw/engines/lanpr/lanpr_engine.c
+++ b/source/blender/draw/engines/lanpr/lanpr_engine.c
@@ -77,6 +77,8 @@ static void lanpr_engine_init(void *ved){
 		lanpr->background_color[2] = 0.51;
 		lanpr->background_color[3] = 1;
 
+		lanpr->depth_influence = 0.3;
+
 		lanpr->reloaded = 1;
 
 		OneTime.InitComplete=1;
@@ -261,6 +263,11 @@ static void lanpr_cache_init(void *vedata){
 		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", lanpr->line_color, 1);
 		DRW_shgroup_uniform_float(stl->g_data->dpix_preview_shgrp, "depth_offset", &stl->g_data->dpix_depth_offset, 1);
+		DRW_shgroup_uniform_float(stl->g_data->dpix_preview_shgrp, "depth_influence", &lanpr->depth_influence, 1);
+		DRW_shgroup_uniform_float(stl->g_data->dpix_preview_shgrp, "depth_curve", &lanpr->depth_curve, 1);
+		DRW_shgroup_uniform_float(stl->g_data->dpix_preview_shgrp, "line_thickness", &lanpr->line_thickness, 1);
+		DRW_shgroup_uniform_float(stl->g_data->dpix_preview_shgrp, "zNear", &stl->g_data->dpix_znear, 1);
+		DRW_shgroup_uniform_float(stl->g_data->dpix_preview_shgrp, "zFar", &stl->g_data->dpix_zfar, 1);
 
 		pd->begin_index = 0;
 		int tsize = sizeof(float) * 4 * TNS_DPIX_TEXTURE_SIZE*TNS_DPIX_TEXTURE_SIZE;
diff --git a/source/blender/draw/engines/lanpr/shaders/lanpr_atlas_preview.geometry b/source/blender/draw/engines/lanpr/shaders/lanpr_atlas_preview.geometry
index 791d924f0a7..70714c44fa9 100644
--- a/source/blender/draw/engines/lanpr/shaders/lanpr_atlas_preview.geometry
+++ b/source/blender/draw/engines/lanpr/shaders/lanpr_atlas_preview.geometry
@@ -1,8 +1,5 @@
 layout (points) in;
-layout (line_strip, max_vertices = 2) out;
-
-//in vec4 gColor[];
-//out vec4 fColor;
+layout (triangle_strip, max_vertices = 6) out;
 
 uniform sampler2D vert0_tex;//L
 uniform sampler2D vert1_tex;//R
@@ -10,21 +7,59 @@ uniform sampler2D vert1_tex;//R
 uniform vec4 viewport; // viewport
 uniform float depth_offset;
 
-void main() {
-    //fColor = gColor[0];
-	
-	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);
+// these are for depth related thickness control;
+uniform float line_thickness;
+uniform float depth_influence;
+uniform float depth_curve;
+uniform float zNear;
+uniform float zFar;
+
+float get_linear_depth(float z){
+	float ze = 2.0 * zNear * zFar / (zFar + zNear - z * (zFar - zNear));
+	return (ze-zNear)/(zFar-zNear);
+}
 
-	//gl_Position = vec4(1,0,0.5,1);
-	gl_Position = vec4(p1.x,p1.y,p1.z-depth_offset,p1.w);
-    EmitVertex();
+float exp_depth(float z,float factor){
+	return pow(z,1-factor); // factor is -inf~1-eps
+}
 
-	//fColor = gColor[0];
-	
-	//gl_Position = vec4(0,0,0.5,1);
-	gl_Position = vec4(p2.x,p2.y,p2.z-depth_offset,p2.w);
-    EmitVertex();
+vec4 apply_depth_scale(vec4 center, vec4 a){
+	float depth_factor = mix(0,exp_depth(get_linear_depth(center.z),depth_curve),depth_influence);
+    return  mix(a,center,depth_factor);
+}
+
+void draw_line(vec4 p1, vec4 p2){
+
+    vec4 Line = p2-p1;
+	vec4 Normal = normalize(vec4(-Line.y,Line.x,0,0));
     
+	vec4 a,b,c,d;
+    
+	vec4 offset = Normal*line_thickness*0.001;
+	a = p1 + offset;
+    b = p1 - offset;
+	c = p2 + offset;
+    d = p2 - offset;
+
+	a = apply_depth_scale(p1,a);
+	b = apply_depth_scale(p1,b);
+	c = apply_depth_scale(p2,c);
+	d = apply_depth_scale(p2,d);
+
+	gl_Position = vec4(a.xy,a.z-depth_offset,a.w); EmitVertex();
+	gl_Position = vec4(b.xy,b.z-depth_offset,b.w); EmitVertex();
+    gl_Position = vec4(c.xy,c.z-depth_offset,c.w); EmitVertex();
+
+	gl_Position = vec4(b.xy,b.z-depth_offset,b.w); EmitVertex();
+    gl_Position = vec4(c.xy,c.z-depth_offset,c.w); EmitVertex();
+	gl_Position = vec4(d.xy,d.z-depth_offset,d.w); EmitVertex();
+
     EndPrimitive();
+}
+
+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);
+    
+	draw_line(p1,p2);
 }
\ No newline at end of file
diff --git a/source/blender/draw/engines/lanpr/shaders/lanpr_atlas_project_clip.fragment b/source/blender/draw/engines/lanpr/shaders/lanpr_atlas_project_clip.fragment
index a0d4e73ccca..1cee818c34e 100644
--- a/source/blender/draw/engines/lanpr/shaders/lanpr_atlas_project_clip.fragment
+++ b/source/blender/draw/engines/lanpr/shaders/lanpr_atlas_project_clip.fragment
@@ -1,16 +1,14 @@
 //#extension GL_ARB_texture_rectangle : enable
 
+uniform mat4 ModelMatrix;
+uniform mat4 ViewMatrix;
+uniform mat4 ViewMatrixInverse;
+uniform mat4 ProjectionMatrix;
+uniform mat4 ProjectionMatrixInverse;
 
+uniform int is_perspective; // persp and orth use different feature determin method
 
-uniform mat4 ModelMatrix; //ModelMatrix
-uniform mat4 ViewMatrix; //ViewMatrix
-uniform mat4 ViewMatrixInverse; //ViewMatrixInv
-uniform mat4 ProjectionMatrix; //ProjectionMatrix
-uniform mat4 ProjectionMatrixInverse; //ProjectionMatrixInverse
-
-uniform int is_perspective;
-
-uniform float sample_step;
+uniform float sample_step; // length calculation unused now.
 
 uniform int buffer_width;
 
@@ -29,6 +27,7 @@ uniform sampler2D face_normal1_tex;
 vec3 view_pos;
 vec3 view_dir;
 
+// these are for adapting argument names...
 #define modelview (ViewMatrix*ModelMatrix)
 #define projection ProjectionMatrix
 #define inverse_projection ProjectionMatrixInverse
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 0edb8c30b15..89ddce8ecbf 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -206,7 +206,7 @@ void DRW_texture_ensure_2D(
         struct GPUTexture **tex, int w, int h, GPUTextureFormat format, DRWTextureFlag flags);
 
 void DRW_texture_ensure_fullscreen_2D_multisample(
-        struct 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list