mirror of https://github.com/CGAL/cgal
Added clip support for tetrahedral meshes
This commit is contained in:
parent
41702c944b
commit
45f0c6665a
|
|
@ -2,6 +2,7 @@
|
||||||
in vec4 color;
|
in vec4 color;
|
||||||
in vec4 fP;
|
in vec4 fP;
|
||||||
in vec3 fN;
|
in vec3 fN;
|
||||||
|
in float dist[6];
|
||||||
flat in vec2 subdomain_out;
|
flat in vec2 subdomain_out;
|
||||||
uniform vec4 light_pos;
|
uniform vec4 light_pos;
|
||||||
uniform vec4 light_diff;
|
uniform vec4 light_diff;
|
||||||
|
|
@ -10,6 +11,7 @@ uniform vec4 light_amb;
|
||||||
uniform float spec_power ;
|
uniform float spec_power ;
|
||||||
uniform int is_two_side;
|
uniform int is_two_side;
|
||||||
uniform bool is_selected;
|
uniform bool is_selected;
|
||||||
|
uniform bool is_clipbox_on;
|
||||||
uniform float near;
|
uniform float near;
|
||||||
uniform float far;
|
uniform float far;
|
||||||
uniform float width;
|
uniform float width;
|
||||||
|
|
@ -28,7 +30,19 @@ float depth(float z)
|
||||||
return (2 * near) / (far + near - z * (far - near));
|
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)
|
if(is_filterable)
|
||||||
{
|
{
|
||||||
uint domain1 = uint(subdomain_out.x);
|
uint domain1 = uint(subdomain_out.x);
|
||||||
|
|
@ -37,10 +51,15 @@ void main(void) {
|
||||||
uint i2 = domain2/25u;
|
uint i2 = domain2/25u;
|
||||||
uint visible1 = uint(is_visible_bitset[i1]);
|
uint visible1 = uint(is_visible_bitset[i1]);
|
||||||
uint visible2 = uint(is_visible_bitset[i2]);
|
uint visible2 = uint(is_visible_bitset[i2]);
|
||||||
if((visible1>>(domain1%25u))%2u == 0u && (visible2>>(domain2%25u))%2u == 0u)
|
return (visible1>>(domain1%25u))%2u == 0u && (visible2>>(domain2%25u))%2u == 0u;
|
||||||
{
|
|
||||||
discard;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main(void) {
|
||||||
|
if (compute_clip_visibility() || compute_filtering_visibility()) {
|
||||||
|
discard;
|
||||||
}
|
}
|
||||||
float d = depth(gl_FragCoord.z);
|
float d = depth(gl_FragCoord.z);
|
||||||
float test = texture(sampler, vec2(gl_FragCoord.x/width, gl_FragCoord.y/height)).r;
|
float test = texture(sampler, vec2(gl_FragCoord.x/width, gl_FragCoord.y/height)).r;
|
||||||
|
|
|
||||||
|
|
@ -12,13 +12,37 @@ uniform float shrink_factor;
|
||||||
out vec4 fP;
|
out vec4 fP;
|
||||||
out vec3 fN;
|
out vec3 fN;
|
||||||
out vec4 color;
|
out vec4 color;
|
||||||
|
out float dist[6];
|
||||||
flat out vec2 subdomain_out;
|
flat out vec2 subdomain_out;
|
||||||
|
uniform bool is_clipbox_on;
|
||||||
|
uniform mat4 clipbox1;
|
||||||
|
uniform mat4 clipbox2;
|
||||||
uniform float point_size;
|
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)
|
void main(void)
|
||||||
{
|
{
|
||||||
subdomain_out = subdomain_in;
|
subdomain_out = subdomain_in;
|
||||||
gl_PointSize = point_size;
|
gl_PointSize = point_size;
|
||||||
color = vec4(colors, vertex.x * cutplane.x + vertex.y * cutplane.y + vertex.z * cutplane.z + cutplane.w);
|
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;
|
fP = mv_matrix * vertex;
|
||||||
|
|
||||||
mat3 norm_matrix_3;
|
mat3 norm_matrix_3;
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,22 @@
|
||||||
#version 150
|
#version 150
|
||||||
in vec4 color;
|
in vec4 color;
|
||||||
|
in float dist[6];
|
||||||
flat in vec2 subdomain_out;
|
flat in vec2 subdomain_out;
|
||||||
|
uniform bool is_clipbox_on;
|
||||||
uniform bool is_surface;
|
uniform bool is_surface;
|
||||||
uniform vec4 is_visible_bitset;
|
uniform vec4 is_visible_bitset;
|
||||||
uniform bool is_filterable;
|
uniform bool is_filterable;
|
||||||
out vec4 out_color;
|
out vec4 out_color;
|
||||||
void main(void)
|
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)
|
if(is_filterable)
|
||||||
{
|
{
|
||||||
uint domain1 = uint(subdomain_out.x);
|
uint domain1 = uint(subdomain_out.x);
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,36 @@ in vec2 subdomain_in;
|
||||||
uniform mat4 mvp_matrix;
|
uniform mat4 mvp_matrix;
|
||||||
uniform vec4 cutplane;
|
uniform vec4 cutplane;
|
||||||
out vec4 color;
|
out vec4 color;
|
||||||
|
out float dist[6];
|
||||||
uniform float point_size;
|
uniform float point_size;
|
||||||
flat out vec2 subdomain_out;
|
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)
|
void main(void)
|
||||||
{
|
{
|
||||||
subdomain_out = subdomain_in;
|
subdomain_out = subdomain_in;
|
||||||
gl_PointSize = point_size;
|
gl_PointSize = point_size;
|
||||||
color = vec4(colors, vertex.x * cutplane.x + vertex.y * cutplane.y + vertex.z * cutplane.z + cutplane.w);
|
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;
|
gl_Position = mvp_matrix * vertex;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue