[Bf-blender-cvs] [2da005902f4] tmp-worbench-rewrite2-optimizations: Draw: Cleanup the GLSL intersection code

Miguel Pozo noreply at git.blender.org
Fri Jan 20 20:24:17 CET 2023


Commit: 2da005902f434b6d4301516e280c899129384b95
Author: Miguel Pozo
Date:   Fri Jan 13 17:51:54 2023 +0100
Branches: tmp-worbench-rewrite2-optimizations
https://developer.blender.org/rB2da005902f434b6d4301516e280c899129384b95

Draw: Cleanup the GLSL intersection code

===================================================================

M	source/blender/draw/intern/shaders/common_intersect_lib.glsl
M	source/blender/draw/intern/shaders/common_math_geom_lib.glsl

===================================================================

diff --git a/source/blender/draw/intern/shaders/common_intersect_lib.glsl b/source/blender/draw/intern/shaders/common_intersect_lib.glsl
index d1416e220a4..080771ca49b 100644
--- a/source/blender/draw/intern/shaders/common_intersect_lib.glsl
+++ b/source/blender/draw/intern/shaders/common_intersect_lib.glsl
@@ -124,311 +124,137 @@ IsectFrustum isect_data_setup(Frustum shape)
 /** \} */
 
 /* ---------------------------------------------------------------------- */
-/** \name View Intersection functions.
+/** \name Shape vs. Shape Intersection functions.
  * \{ */
 
-bool intersect_view(Pyramid pyramid)
+bool intersect(IsectPyramid i_pyramid, IsectBox i_box)
 {
-  bool intersects = true;
-
-  /* Do Pyramid vertices vs Frustum planes. */
-  for (int p = 0; p < 6; ++p) {
-    bool is_any_vertex_on_positive_side = false;
-    for (int v = 0; v < 5; ++v) {
-      float test = dot(drw_view_culling.planes[p], vec4(pyramid.corners[v], 1.0));
-      if (test > 0.0) {
-        is_any_vertex_on_positive_side = true;
-        break;
-      }
-    }
-    bool all_vertex_on_negative_side = !is_any_vertex_on_positive_side;
-    if (all_vertex_on_negative_side) {
-      intersects = false;
-      break;
-    }
-  }
-
-  if (!intersects) {
-    return intersects;
-  }
-
-  /* Now do Frustum vertices vs Pyramid planes. */
-  IsectPyramid i_pyramid = isect_data_setup(pyramid);
+  /* Do Box vertices vs Pyramid planes. */
   for (int p = 0; p < 5; ++p) {
-    bool is_any_vertex_on_positive_side = false;
-    for (int v = 0; v < 8; ++v) {
-      float test = dot(i_pyramid.planes[p], vec4(drw_view_culling.corners[v].xyz, 1.0));
-      if (test > 0.0) {
-        is_any_vertex_on_positive_side = true;
-        break;
-      }
-    }
-    bool all_vertex_on_negative_side = !is_any_vertex_on_positive_side;
-    if (all_vertex_on_negative_side) {
-      intersects = false;
-      break;
-    }
-  }
-  return intersects;
-}
-
-bool intersect_view(Box box)
-{
-  bool intersects = true;
-
-  /* Do Box vertices vs Frustum planes. */
-  for (int p = 0; p < 6; ++p) {
-    bool is_any_vertex_on_positive_side = false;
-    for (int v = 0; v < 8; ++v) {
-      float test = dot(drw_view_culling.planes[p], vec4(box.corners[v], 1.0));
-      if (test > 0.0) {
-        is_any_vertex_on_positive_side = true;
-        break;
-      }
-    }
-    bool all_vertex_on_negative_side = !is_any_vertex_on_positive_side;
-    if (all_vertex_on_negative_side) {
-      intersects = false;
-      break;
-    }
-  }
-
-  if (!intersects) {
-    return intersects;
-  }
-
-  /* Now do Frustum vertices vs Box planes. */
-  IsectBox i_box = isect_data_setup(box);
-  for (int p = 0; p < 6; ++p) {
-    bool is_any_vertex_on_positive_side = false;
-    for (int v = 0; v < 8; ++v) {
-      float test = dot(i_box.planes[p], vec4(drw_view_culling.corners[v].xyz, 1.0));
-      if (test > 0.0) {
-        is_any_vertex_on_positive_side = true;
-        break;
-      }
-    }
-    bool all_vertex_on_negative_side = !is_any_vertex_on_positive_side;
-    if (all_vertex_on_negative_side) {
-      intersects = false;
-      break;
-    }
-  }
-
-  return intersects;
-}
-
-bool intersect_view(IsectBox i_box)
-{
-  bool intersects = true;
-
-  /* Do Box vertices vs Frustum planes. */
-  for (int p = 0; p < 6; ++p) {
-    bool is_any_vertex_on_positive_side = false;
+    bool separating_axis = true;
     for (int v = 0; v < 8; ++v) {
-      float test = dot(drw_view_culling.planes[p], vec4(i_box.corners[v], 1.0));
-      if (test > 0.0) {
-        is_any_vertex_on_positive_side = true;
+      float signed_distance = point_plane_projection_dist(i_box.corners[v], i_pyramid.planes[p]);
+      if (signed_distance <= 0.0) {
+        separating_axis = false;
         break;
       }
     }
-    bool all_vertex_on_negative_side = !is_any_vertex_on_positive_side;
-    if (all_vertex_on_negative_side) {
-      intersects = false;
-      break;
+    if (separating_axis) {
+      return false;
     }
   }
 
-  if (!intersects) {
-    return intersects;
-  }
-
+  /* Now do Pyramid vertices vs Box planes. */
   for (int p = 0; p < 6; ++p) {
-    bool is_any_vertex_on_positive_side = false;
-    for (int v = 0; v < 8; ++v) {
-      float test = dot(i_box.planes[p], vec4(drw_view_culling.corners[v].xyz, 1.0));
-      if (test > 0.0) {
-        is_any_vertex_on_positive_side = true;
+    bool separating_axis = true;
+    for (int v = 0; v < 5; ++v) {
+      float signed_distance = point_plane_projection_dist(i_pyramid.corners[v], i_box.planes[p]);
+      if (signed_distance <= 0.0) {
+        separating_axis = false;
         break;
       }
     }
-    bool all_vertex_on_negative_side = !is_any_vertex_on_positive_side;
-    if (all_vertex_on_negative_side) {
-      intersects = false;
-      break;
+    if (separating_axis) {
+      return false;
     }
   }
 
-  return intersects;
-}
-
-bool intersect_view(Sphere sphere)
-{
-  bool intersects = true;
-
-  for (int p = 0; p < 6 && intersects; ++p) {
-    float dist_to_plane = dot(drw_view_culling.planes[p], vec4(sphere.center, 1.0));
-    if (dist_to_plane < -sphere.radius) {
-      intersects = false;
-    }
-  }
-  /* TODO reject false positive. */
-  return intersects;
+  return true;
 }
 
-/** \} */
-
-/* ---------------------------------------------------------------------- */
-/** \name Shape vs. Shape Intersection functions.
- * \{ */
-
 bool intersect(IsectPyramid i_pyramid, Box box)
 {
-  bool intersects = true;
-
-  /* Do Box vertices vs Pyramid planes. */
-  for (int p = 0; p < 5; ++p) {
-    bool is_any_vertex_on_positive_side = false;
-    for (int v = 0; v < 8; ++v) {
-      float test = dot(i_pyramid.planes[p], vec4(box.corners[v], 1.0));
-      if (test > 0.0) {
-        is_any_vertex_on_positive_side = true;
-        break;
-      }
-    }
-    bool all_vertex_on_negative_side = !is_any_vertex_on_positive_side;
-    if (all_vertex_on_negative_side) {
-      intersects = false;
-      break;
-    }
-  }
-
-  if (!intersects) {
-    return intersects;
-  }
-
-  /* Now do Pyramid vertices vs Box planes. */
-  IsectBox i_box = isect_data_setup(box);
-  for (int p = 0; p < 6; ++p) {
-    bool is_any_vertex_on_positive_side = false;
-    for (int v = 0; v < 5; ++v) {
-      float test = dot(i_box.planes[p], vec4(i_pyramid.corners[v], 1.0));
-      if (test > 0.0) {
-        is_any_vertex_on_positive_side = true;
-        break;
-      }
-    }
-    bool all_vertex_on_negative_side = !is_any_vertex_on_positive_side;
-    if (all_vertex_on_negative_side) {
-      intersects = false;
-      break;
-    }
-  }
-  return intersects;
+  return intersect(i_pyramid, isect_data_setup(box));
 }
 
 bool intersect(IsectFrustum i_frustum, Pyramid pyramid)
 {
-  bool intersects = true;
-
   /* Do Pyramid vertices vs Frustum planes. */
   for (int p = 0; p < 6; ++p) {
-    bool is_any_vertex_on_positive_side = false;
+    bool separating_axis = true;
     for (int v = 0; v < 5; ++v) {
-      float test = dot(i_frustum.planes[p], vec4(pyramid.corners[v], 1.0));
-      if (test > 0.0) {
-        is_any_vertex_on_positive_side = true;
+      float signed_distance = point_plane_projection_dist(pyramid.corners[v], i_frustum.planes[p]);
+      if (signed_distance <= 0.0) {
+        separating_axis = false;
         break;
       }
     }
-    bool all_vertex_on_negative_side = !is_any_vertex_on_positive_side;
-    if (all_vertex_on_negative_side) {
-      intersects = false;
-      break;
+    if (separating_axis) {
+      return false;
     }
   }
 
-  if (!intersects) {
-    return intersects;
-  }
-
   /* Now do Frustum vertices vs Pyramid planes. */
   IsectPyramid i_pyramid = isect_data_setup(pyramid);
   for (int p = 0; p < 5; ++p) {
-    bool is_any_vertex_on_positive_side = false;
+    bool separating_axis = true;
     for (int v = 0; v < 8; ++v) {
-      float test = dot(i_pyramid.planes[p], vec4(i_frustum.corners[v].xyz, 1.0));
-      if (test > 0.0) {
-        is_any_vertex_on_positive_side = true;
+      float signed_distance = point_plane_projection_dist(i_frustum.corners[v].xyz,
+                                                          i_pyramid.planes[p]);
+      if (signed_distance <= 0.0) {
+        separating_axis = false;
         break;
       }
     }
-    bool all_vertex_on_negative_side = !is_any_vertex_on_positive_side;
-    if (all_vertex_on_negative_side) {
-      intersects = false;
-      break;
+    if (separating_axis) {
+      return false;
     }
   }
-  return intersects;
+
+  return true;
 }
 
-bool intersect(IsectFrustum i_frustum, Box box)
+bool intersect(IsectFrustum i_frustum, IsectBox i_box)
 {
-  bool intersects = true;
-
   /* Do Box vertices vs Frustum planes. */
   for (int p = 0; p < 6; ++p) {
-    bool is_any_vertex_on_positive_side = false;
+    bool separating_axis = true;
     for (int v = 0; v < 8; ++v) {
-      float test = dot(i_frustum.planes[p], vec4(box.corners[v], 1.0));
-      if (test > 0.0) {
-        is_any_vertex_on_positive_side = true;
+      float signed_distance = point_plane_projection_dist(i_box.corners[v], i_frustum.planes[p]);
+      if (signed_distance <= 0.0) {
+        separating_axis = false;
         break;
       }
     }
-    bool all_vertex_on_negative_side = !is_any_vertex_on_positive_side;
-    if (all_vertex_on_negative_side) {
-      intersects = false;
-      break;
+    if (separating_axis) {
+      return false;
     }
   }
 
-  if (!intersects) {
-    return intersects;
-  }
-
   /* Now do Frustum vertices vs Box planes. */
-  IsectBox i_box = isect_data_setup(box);
   for (int p = 0; p < 6; ++p) {
-    bool is_any_vertex_on_positive_side = false;
+    bool separating_axis = true;
     for (int v = 0; v < 8; ++v) {
-      float test = dot(i_box.planes[p], vec4(i_frustum.corners[v].xyz, 1.0));
-      if (test > 0.0) {
-        is_any_vertex_on_positive_side = true;
+      float signed_distance = point_plane_projection_dist(i_frustum.corners[v].xyz,
+                                                          i_box.planes[p]);
+      if (signed_distance <= 0.0) {
+        separating_axis = false;
         break;
       }
     }
-    bool all_vertex_on_negative_side = !is_any_vertex_on_positive_side;
-    if (all_ve

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list