Skip to content

Instantly share code, notes, and snippets.

@paniq
Created November 14, 2017 09:18
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save paniq/907e4b8fb32aa99762a3a6dc38181b5c to your computer and use it in GitHub Desktop.
bool in_wedge(vec2 p, vec2 u) {
return (p.x >= u[0]*p.y) && (p.x <= u[1]*p.y);
}
bool in_frustum(vec3 p, vec2 u, vec2 v) {
return in_wedge(p.xz, u) && in_wedge(p.yz, v);
}
void merge_plane_range(inout vec2 outer, vec2 p0, vec2 p1, vec2 u) {
outer[0] = in_wedge(p0, u)?min(outer[0], p0.y):outer[0];
outer[1] = in_wedge(p1, u)?max(outer[1], p1.y):outer[1];
}
void merge_corner_range(inout vec2 outer, inout vec2 inner, float z0, float z1) {
outer[0] = min(outer[0], z0);
outer[1] = max(outer[1], z1);
inner[0] = max(inner[0], (z0 == z0)?z0:infinity);
inner[1] = min(inner[1], (z1 == z1)?z1:-infinity);
}
vec4 compute_bounds(bounds2x3 bounds, vec2 u, vec2 v) {
vec2 outer = vec2(infinity, -infinity);
vec2 inner = vec2(-infinity, infinity);
outer[0] = in_frustum(bounds.v0, u, v)?min(outer[0], bounds.v0.z):outer[0];
outer[1] = in_frustum(bounds.v1, u, v)?max(outer[1], bounds.v1.z):outer[1];
merge_corner_range(outer, inner, bounds.c00_0.z, bounds.c00_1.z);
merge_corner_range(outer, inner, bounds.c01_0.z, bounds.c01_1.z);
merge_corner_range(outer, inner, bounds.c10_0.z, bounds.c10_1.z);
merge_corner_range(outer, inner, bounds.c11_0.z, bounds.c11_1.z);
merge_plane_range(outer, bounds.eh0_0.yz, bounds.eh0_1.yz, v);
merge_plane_range(outer, bounds.eh1_0.yz, bounds.eh1_1.yz, v);
merge_plane_range(outer, bounds.ev0_0.xz, bounds.ev0_1.xz, u);
merge_plane_range(outer, bounds.ev1_0.xz, bounds.ev1_1.xz, u);
return vec4(outer, inner);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment