diff --git a/Polyhedron/demo/Polyhedron/resources/shader_c3t3.frag b/Polyhedron/demo/Polyhedron/resources/shader_c3t3.frag index 27b255c5e1c..9408f3d5932 100644 --- a/Polyhedron/demo/Polyhedron/resources/shader_c3t3.frag +++ b/Polyhedron/demo/Polyhedron/resources/shader_c3t3.frag @@ -2,6 +2,7 @@ in vec4 color; in vec4 fP; in vec3 fN; +in float dist[6]; flat in vec2 subdomain_out; uniform vec4 light_pos; uniform vec4 light_diff; @@ -10,6 +11,7 @@ uniform vec4 light_amb; uniform float spec_power ; uniform int is_two_side; uniform bool is_selected; +uniform bool is_clipbox_on; uniform float near; uniform float far; uniform float width; @@ -28,7 +30,19 @@ float depth(float z) return (2 * near) / (far + near - z * (far - near)); } -void main(void) { +bool compute_clip_visibility() { + if(is_clipbox_on) + return dist[0]>0.0 || + dist[1]>0.0 || + dist[2]>0.0 || + dist[3]>0.0 || + dist[4]>0.0 || + dist[5]>0.0; + else + return false; +} + +bool compute_filtering_visibility() { if(is_filterable) { uint domain1 = uint(subdomain_out.x); @@ -37,10 +51,15 @@ void main(void) { uint i2 = domain2/25u; uint visible1 = uint(is_visible_bitset[i1]); uint visible2 = uint(is_visible_bitset[i2]); - if((visible1>>(domain1%25u))%2u == 0u && (visible2>>(domain2%25u))%2u == 0u) - { - discard; - } + return (visible1>>(domain1%25u))%2u == 0u && (visible2>>(domain2%25u))%2u == 0u; + } + else + return false; +} + +void main(void) { + if (compute_clip_visibility() || compute_filtering_visibility()) { + discard; } float d = depth(gl_FragCoord.z); float test = texture(sampler, vec2(gl_FragCoord.x/width, gl_FragCoord.y/height)).r; diff --git a/Polyhedron/demo/Polyhedron/resources/shader_c3t3.vert b/Polyhedron/demo/Polyhedron/resources/shader_c3t3.vert index 2298a14b15c..b7677129d66 100644 --- a/Polyhedron/demo/Polyhedron/resources/shader_c3t3.vert +++ b/Polyhedron/demo/Polyhedron/resources/shader_c3t3.vert @@ -12,13 +12,37 @@ uniform float shrink_factor; out vec4 fP; out vec3 fN; out vec4 color; +out float dist[6]; flat out vec2 subdomain_out; +uniform bool is_clipbox_on; +uniform mat4 clipbox1; +uniform mat4 clipbox2; uniform float point_size; + +void compute_distances(void) +{ + for(int i=0; i<3; ++i) + { + dist[i]= + clipbox1[i][0]*vertex.x+ + clipbox1[i][1]*vertex.y+ + clipbox1[i][2]*vertex.z + + clipbox1[i][3]; + dist[i+3]= + clipbox2[i][0]*vertex.x+ + clipbox2[i][1]*vertex.y+ + clipbox2[i][2]*vertex.z + + clipbox2[i][3]; + } +} + void main(void) { subdomain_out = subdomain_in; gl_PointSize = point_size; color = vec4(colors, vertex.x * cutplane.x + vertex.y * cutplane.y + vertex.z * cutplane.z + cutplane.w); + if(is_clipbox_on) + compute_distances(); fP = mv_matrix * vertex; mat3 norm_matrix_3; diff --git a/Polyhedron/demo/Polyhedron/resources/shader_c3t3_edges.frag b/Polyhedron/demo/Polyhedron/resources/shader_c3t3_edges.frag index c3fbb6bba00..d15d6e12512 100644 --- a/Polyhedron/demo/Polyhedron/resources/shader_c3t3_edges.frag +++ b/Polyhedron/demo/Polyhedron/resources/shader_c3t3_edges.frag @@ -1,12 +1,22 @@ #version 150 in vec4 color; +in float dist[6]; flat in vec2 subdomain_out; +uniform bool is_clipbox_on; uniform bool is_surface; uniform vec4 is_visible_bitset; uniform bool is_filterable; out vec4 out_color; void main(void) { + if(is_clipbox_on) + if(dist[0]>0.0 || + dist[1]>0.0 || + dist[2]>0.0 || + dist[3]>0.0 || + dist[4]>0.0 || + dist[5]>0.0) + discard; if(is_filterable) { uint domain1 = uint(subdomain_out.x); diff --git a/Polyhedron/demo/Polyhedron/resources/shader_c3t3_edges.vert b/Polyhedron/demo/Polyhedron/resources/shader_c3t3_edges.vert index 9d00649a829..60f51ff758a 100644 --- a/Polyhedron/demo/Polyhedron/resources/shader_c3t3_edges.vert +++ b/Polyhedron/demo/Polyhedron/resources/shader_c3t3_edges.vert @@ -5,12 +5,36 @@ in vec2 subdomain_in; uniform mat4 mvp_matrix; uniform vec4 cutplane; out vec4 color; +out float dist[6]; uniform float point_size; flat out vec2 subdomain_out; +uniform bool is_clipbox_on; +uniform mat4 clipbox1; +uniform mat4 clipbox2; + +void compute_distances(void) +{ + for(int i=0; i<3; ++i) + { + dist[i]= + clipbox1[i][0]*vertex.x+ + clipbox1[i][1]*vertex.y+ + clipbox1[i][2]*vertex.z + + clipbox1[i][3]; + dist[i+3]= + clipbox2[i][0]*vertex.x+ + clipbox2[i][1]*vertex.y+ + clipbox2[i][2]*vertex.z + + clipbox2[i][3]; + } +} + void main(void) { subdomain_out = subdomain_in; gl_PointSize = point_size; color = vec4(colors, vertex.x * cutplane.x + vertex.y * cutplane.y + vertex.z * cutplane.z + cutplane.w); + if(is_clipbox_on) + compute_distances(); gl_Position = mvp_matrix * vertex; }