Added clip support for tetrahedral meshes

This commit is contained in:
ange-clement 2023-09-25 10:50:29 +02:00
parent 41702c944b
commit 45f0c6665a
4 changed files with 82 additions and 5 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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;
} }