[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