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

View File

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

View File

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

View File

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