226 lines
18 KiB
GLSL
226 lines
18 KiB
GLSL
// Copyright (C) 2021, Christoph Peters, Karlsruhe Institute of Technology
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
|
|
/*! Returns the intersection of the line connecting the given two points with
|
|
the plane z == 0.0f.*/
|
|
vec3 iz0(vec3 lhs, vec3 rhs) {
|
|
float lerp_factor = lhs.z / (lhs.z - rhs.z);
|
|
// Equivalent to the following but I have trust issues regarding the
|
|
// stability of mix()
|
|
// return vec3(mix(lhs.xy, rhs.xy, lerp_factor), 0.0f);
|
|
return vec3(fma(vec2(lerp_factor), rhs.xy, fma(-vec2(lerp_factor), lhs.xy, lhs.xy)), 0.0f);
|
|
}
|
|
|
|
|
|
/*! This function clips the given convex polygon with vertices in v to the
|
|
upper hemisphere (i.e. the half-space with non-negative z-coordinate).
|
|
The vertex count after clipping is returned. It is either zero or between
|
|
three and vertex_count + 1. If it is less than MAX_POLYGON_VERTEX_COUNT,
|
|
the first entry of v is repeated at the returned vertex count for the
|
|
output. vertex_count must be at least
|
|
MIN_POLYGON_VERTEX_COUNT_BEFORE_CLIPPING.*/
|
|
uint clip_polygon(uint vertex_count, inout vec3 v[MAX_POLYGON_VERTEX_COUNT]) {
|
|
// The vertex count after clipping
|
|
uint vc;
|
|
// Encode the whole configuration into a single integer
|
|
uint bit_mask = vertex_count;
|
|
[[unroll]]
|
|
for (uint i = 0; i != MAX_POLYGON_VERTEX_COUNT - 1; ++i)
|
|
bit_mask |= (v[i].z > 0.0f && (i < MIN_POLYGON_VERTEX_COUNT_BEFORE_CLIPPING || i < vertex_count)) ? (1 << (i + 3)) : 0;
|
|
// This code has been generated automatically to handle all possible cases
|
|
// with a single conditional jump and no unnecessary instructions
|
|
switch (bit_mask) {
|
|
// AUTOGENERATED PART BEGIN
|
|
#if MIN_POLYGON_VERTEX_COUNT_BEFORE_CLIPPING <= 3 && MAX_POLYGON_VERTEX_COUNT >= 4
|
|
case 3: vc = 0; break;
|
|
case 59: vc = 3; v[3] = v[0]; break;
|
|
case 11: vc = 3; v[1] = iz0(v[0], v[1]); v[2] = iz0(v[2], v[0]); v[3] = v[0]; break;
|
|
case 19: vc = 3; v[0] = iz0(v[0], v[1]); v[2] = iz0(v[1], v[2]); v[3] = v[0]; break;
|
|
case 35: vc = 3; v[0] = iz0(v[2], v[0]); v[1] = iz0(v[1], v[2]); v[3] = v[0]; break;
|
|
#endif
|
|
#if MIN_POLYGON_VERTEX_COUNT_BEFORE_CLIPPING <= 3 && MAX_POLYGON_VERTEX_COUNT == 4
|
|
case 27: vc = 4; v[3] = iz0(v[2], v[0]); v[2] = iz0(v[1], v[2]); break;
|
|
case 51: vc = 4; v[3] = iz0(v[2], v[0]); v[0] = iz0(v[0], v[1]); break;
|
|
case 43: vc = 4; v[3] = v[2]; v[2] = iz0(v[1], v[2]); v[1] = iz0(v[0], v[1]); break;
|
|
#elif MIN_POLYGON_VERTEX_COUNT_BEFORE_CLIPPING <= 3 && MAX_POLYGON_VERTEX_COUNT > 4
|
|
case 27: vc = 4; v[3] = iz0(v[2], v[0]); v[2] = iz0(v[1], v[2]); v[4] = v[0]; break;
|
|
case 51: vc = 4; v[3] = iz0(v[2], v[0]); v[0] = iz0(v[0], v[1]); v[4] = v[0]; break;
|
|
case 43: vc = 4; v[3] = v[2]; v[2] = iz0(v[1], v[2]); v[1] = iz0(v[0], v[1]); v[4] = v[0]; break;
|
|
#endif
|
|
#if MIN_POLYGON_VERTEX_COUNT_BEFORE_CLIPPING <= 4 && MAX_POLYGON_VERTEX_COUNT >= 5
|
|
case 4: vc = 0; break;
|
|
case 124: vc = 4; v[4] = v[0]; break;
|
|
case 12: vc = 3; v[1] = iz0(v[0], v[1]); v[2] = iz0(v[3], v[0]); v[3] = v[0]; break;
|
|
case 20: vc = 3; v[0] = iz0(v[0], v[1]); v[2] = iz0(v[1], v[2]); v[3] = v[0]; break;
|
|
case 36: vc = 3; v[0] = iz0(v[2], v[3]); v[1] = iz0(v[1], v[2]); v[3] = v[0]; break;
|
|
case 68: vc = 3; v[1] = iz0(v[3], v[0]); v[0] = v[3]; v[2] = iz0(v[2], v[3]); break;
|
|
case 28: vc = 4; v[2] = iz0(v[1], v[2]); v[3] = iz0(v[3], v[0]); v[4] = v[0]; break;
|
|
case 52: vc = 4; v[0] = iz0(v[0], v[1]); v[3] = iz0(v[2], v[3]); v[4] = v[0]; break;
|
|
case 100: vc = 4; v[0] = iz0(v[3], v[0]); v[1] = iz0(v[1], v[2]); v[4] = v[0]; break;
|
|
case 76: vc = 4; v[1] = iz0(v[0], v[1]); v[2] = iz0(v[2], v[3]); v[4] = v[0]; break;
|
|
#endif
|
|
#if MIN_POLYGON_VERTEX_COUNT_BEFORE_CLIPPING <= 4 && MAX_POLYGON_VERTEX_COUNT == 5
|
|
case 60: vc = 5; v[4] = iz0(v[3], v[0]); v[3] = iz0(v[2], v[3]); break;
|
|
case 116: vc = 5; v[4] = iz0(v[3], v[0]); v[0] = iz0(v[0], v[1]); break;
|
|
case 108: vc = 5; v[4] = v[0]; v[0] = iz0(v[0], v[1]); v[1] = iz0(v[1], v[2]); break;
|
|
case 92: vc = 5; v[4] = v[3]; v[3] = iz0(v[2], v[3]); v[2] = iz0(v[1], v[2]); break;
|
|
#elif MIN_POLYGON_VERTEX_COUNT_BEFORE_CLIPPING <= 4 && MAX_POLYGON_VERTEX_COUNT > 5
|
|
case 60: vc = 5; v[4] = iz0(v[3], v[0]); v[3] = iz0(v[2], v[3]); v[5] = v[0]; break;
|
|
case 116: vc = 5; v[4] = iz0(v[3], v[0]); v[0] = iz0(v[0], v[1]); v[5] = v[0]; break;
|
|
case 108: vc = 5; v[4] = v[0]; v[0] = iz0(v[0], v[1]); v[1] = iz0(v[1], v[2]); v[5] = v[0]; break;
|
|
case 92: vc = 5; v[4] = v[3]; v[3] = iz0(v[2], v[3]); v[2] = iz0(v[1], v[2]); v[5] = v[0]; break;
|
|
#endif
|
|
#if MIN_POLYGON_VERTEX_COUNT_BEFORE_CLIPPING <= 5 && MAX_POLYGON_VERTEX_COUNT >= 6
|
|
case 5: vc = 0; break;
|
|
case 253: vc = 5; v[5] = v[0]; break;
|
|
case 13: vc = 3; v[1] = iz0(v[0], v[1]); v[2] = iz0(v[4], v[0]); v[3] = v[0]; break;
|
|
case 21: vc = 3; v[0] = iz0(v[0], v[1]); v[2] = iz0(v[1], v[2]); v[3] = v[0]; break;
|
|
case 37: vc = 3; v[0] = iz0(v[2], v[3]); v[1] = iz0(v[1], v[2]); v[3] = v[0]; break;
|
|
case 69: vc = 3; v[0] = v[3]; v[1] = iz0(v[3], v[4]); v[2] = iz0(v[2], v[3]); break;
|
|
case 133: vc = 3; v[1] = v[4]; v[2] = iz0(v[4], v[0]); v[0] = iz0(v[3], v[4]); v[3] = v[0]; break;
|
|
case 29: vc = 4; v[2] = iz0(v[1], v[2]); v[3] = iz0(v[4], v[0]); v[4] = v[0]; break;
|
|
case 53: vc = 4; v[0] = iz0(v[0], v[1]); v[3] = iz0(v[2], v[3]); v[4] = v[0]; break;
|
|
case 101: vc = 4; v[0] = iz0(v[3], v[4]); v[1] = iz0(v[1], v[2]); v[4] = v[0]; break;
|
|
case 197: vc = 4; v[1] = iz0(v[4], v[0]); v[0] = v[4]; v[2] = iz0(v[2], v[3]); break;
|
|
case 141: vc = 4; v[1] = iz0(v[0], v[1]); v[2] = iz0(v[3], v[4]); v[3] = v[4]; v[4] = v[0]; break;
|
|
case 61: vc = 5; v[3] = iz0(v[2], v[3]); v[4] = iz0(v[4], v[0]); v[5] = v[0]; break;
|
|
case 117: vc = 5; v[0] = iz0(v[0], v[1]); v[4] = iz0(v[3], v[4]); v[5] = v[0]; break;
|
|
case 229: vc = 5; v[0] = iz0(v[4], v[0]); v[1] = iz0(v[1], v[2]); v[5] = v[0]; break;
|
|
case 205: vc = 5; v[1] = iz0(v[0], v[1]); v[2] = iz0(v[2], v[3]); v[5] = v[0]; break;
|
|
case 157: vc = 5; v[2] = iz0(v[1], v[2]); v[3] = iz0(v[3], v[4]); v[5] = v[0]; break;
|
|
#endif
|
|
#if MIN_POLYGON_VERTEX_COUNT_BEFORE_CLIPPING <= 5 && MAX_POLYGON_VERTEX_COUNT == 6
|
|
case 125: vc = 6; v[5] = iz0(v[4], v[0]); v[4] = iz0(v[3], v[4]); break;
|
|
case 245: vc = 6; v[5] = iz0(v[4], v[0]); v[0] = iz0(v[0], v[1]); break;
|
|
case 237: vc = 6; v[5] = v[0]; v[0] = iz0(v[0], v[1]); v[1] = iz0(v[1], v[2]); break;
|
|
case 221: vc = 6; v[5] = v[4]; v[4] = v[3]; v[3] = iz0(v[2], v[3]); v[2] = iz0(v[1], v[2]); break;
|
|
case 189: vc = 6; v[5] = v[4]; v[4] = iz0(v[3], v[4]); v[3] = iz0(v[2], v[3]); break;
|
|
#elif MIN_POLYGON_VERTEX_COUNT_BEFORE_CLIPPING <= 5 && MAX_POLYGON_VERTEX_COUNT > 6
|
|
case 125: vc = 6; v[5] = iz0(v[4], v[0]); v[4] = iz0(v[3], v[4]); v[6] = v[0]; break;
|
|
case 245: vc = 6; v[5] = iz0(v[4], v[0]); v[0] = iz0(v[0], v[1]); v[6] = v[0]; break;
|
|
case 237: vc = 6; v[5] = v[0]; v[0] = iz0(v[0], v[1]); v[1] = iz0(v[1], v[2]); v[6] = v[0]; break;
|
|
case 221: vc = 6; v[5] = v[4]; v[4] = v[3]; v[3] = iz0(v[2], v[3]); v[2] = iz0(v[1], v[2]); v[6] = v[0]; break;
|
|
case 189: vc = 6; v[5] = v[4]; v[4] = iz0(v[3], v[4]); v[3] = iz0(v[2], v[3]); v[6] = v[0]; break;
|
|
#endif
|
|
#if MIN_POLYGON_VERTEX_COUNT_BEFORE_CLIPPING <= 6 && MAX_POLYGON_VERTEX_COUNT >= 7
|
|
case 6: vc = 0; break;
|
|
case 510: vc = 6; v[6] = v[0]; break;
|
|
case 14: vc = 3; v[1] = iz0(v[0], v[1]); v[2] = iz0(v[5], v[0]); v[3] = v[0]; break;
|
|
case 22: vc = 3; v[0] = iz0(v[0], v[1]); v[2] = iz0(v[1], v[2]); v[3] = v[0]; break;
|
|
case 38: vc = 3; v[0] = iz0(v[2], v[3]); v[1] = iz0(v[1], v[2]); v[3] = v[0]; break;
|
|
case 70: vc = 3; v[0] = v[3]; v[1] = iz0(v[3], v[4]); v[2] = iz0(v[2], v[3]); break;
|
|
case 134: vc = 3; v[0] = iz0(v[3], v[4]); v[1] = v[4]; v[2] = iz0(v[4], v[5]); v[3] = v[0]; break;
|
|
case 262: vc = 3; v[1] = v[5]; v[2] = iz0(v[5], v[0]); v[0] = iz0(v[4], v[5]); v[3] = v[0]; break;
|
|
case 30: vc = 4; v[2] = iz0(v[1], v[2]); v[3] = iz0(v[5], v[0]); v[4] = v[0]; break;
|
|
case 54: vc = 4; v[0] = iz0(v[0], v[1]); v[3] = iz0(v[2], v[3]); v[4] = v[0]; break;
|
|
case 102: vc = 4; v[0] = iz0(v[3], v[4]); v[1] = iz0(v[1], v[2]); v[4] = v[0]; break;
|
|
case 198: vc = 4; v[0] = v[4]; v[1] = iz0(v[4], v[5]); v[2] = iz0(v[2], v[3]); break;
|
|
case 390: vc = 4; v[1] = v[5]; v[2] = iz0(v[5], v[0]); v[0] = v[4]; v[3] = iz0(v[3], v[4]); break;
|
|
case 270: vc = 4; v[1] = iz0(v[0], v[1]); v[2] = iz0(v[4], v[5]); v[3] = v[5]; v[4] = v[0]; break;
|
|
case 62: vc = 5; v[3] = iz0(v[2], v[3]); v[4] = iz0(v[5], v[0]); v[5] = v[0]; break;
|
|
case 118: vc = 5; v[0] = iz0(v[0], v[1]); v[4] = iz0(v[3], v[4]); v[5] = v[0]; break;
|
|
case 230: vc = 5; v[0] = iz0(v[4], v[5]); v[1] = iz0(v[1], v[2]); v[5] = v[0]; break;
|
|
case 454: vc = 5; v[1] = iz0(v[5], v[0]); v[0] = v[5]; v[2] = iz0(v[2], v[3]); break;
|
|
case 398: vc = 5; v[2] = iz0(v[0], v[1]); v[1] = v[0]; v[0] = v[5]; v[3] = iz0(v[3], v[4]); break;
|
|
case 286: vc = 5; v[2] = iz0(v[1], v[2]); v[3] = iz0(v[4], v[5]); v[4] = v[5]; v[5] = v[0]; break;
|
|
case 126: vc = 6; v[4] = iz0(v[3], v[4]); v[5] = iz0(v[5], v[0]); v[6] = v[0]; break;
|
|
case 246: vc = 6; v[0] = iz0(v[0], v[1]); v[5] = iz0(v[4], v[5]); v[6] = v[0]; break;
|
|
case 486: vc = 6; v[0] = iz0(v[5], v[0]); v[1] = iz0(v[1], v[2]); v[6] = v[0]; break;
|
|
case 462: vc = 6; v[1] = iz0(v[0], v[1]); v[2] = iz0(v[2], v[3]); v[6] = v[0]; break;
|
|
case 414: vc = 6; v[2] = iz0(v[1], v[2]); v[3] = iz0(v[3], v[4]); v[6] = v[0]; break;
|
|
case 318: vc = 6; v[3] = iz0(v[2], v[3]); v[4] = iz0(v[4], v[5]); v[6] = v[0]; break;
|
|
#endif
|
|
#if MIN_POLYGON_VERTEX_COUNT_BEFORE_CLIPPING <= 6 && MAX_POLYGON_VERTEX_COUNT == 7
|
|
case 254: vc = 7; v[6] = iz0(v[5], v[0]); v[5] = iz0(v[4], v[5]); break;
|
|
case 502: vc = 7; v[6] = iz0(v[5], v[0]); v[0] = iz0(v[0], v[1]); break;
|
|
case 494: vc = 7; v[6] = v[0]; v[0] = iz0(v[0], v[1]); v[1] = iz0(v[1], v[2]); break;
|
|
case 478: vc = 7; v[6] = v[0]; v[0] = v[1]; v[1] = iz0(v[1], v[2]); v[2] = iz0(v[2], v[3]); break;
|
|
case 446: vc = 7; v[6] = v[5]; v[5] = v[4]; v[4] = iz0(v[3], v[4]); v[3] = iz0(v[2], v[3]); break;
|
|
case 382: vc = 7; v[6] = v[5]; v[5] = iz0(v[4], v[5]); v[4] = iz0(v[3], v[4]); break;
|
|
#elif MIN_POLYGON_VERTEX_COUNT_BEFORE_CLIPPING <= 6 && MAX_POLYGON_VERTEX_COUNT > 7
|
|
case 254: vc = 7; v[6] = iz0(v[5], v[0]); v[5] = iz0(v[4], v[5]); v[7] = v[0]; break;
|
|
case 502: vc = 7; v[6] = iz0(v[5], v[0]); v[0] = iz0(v[0], v[1]); v[7] = v[0]; break;
|
|
case 494: vc = 7; v[6] = v[0]; v[0] = iz0(v[0], v[1]); v[1] = iz0(v[1], v[2]); v[7] = v[0]; break;
|
|
case 478: vc = 7; v[6] = v[0]; v[0] = v[1]; v[1] = iz0(v[1], v[2]); v[2] = iz0(v[2], v[3]); v[7] = v[0]; break;
|
|
case 446: vc = 7; v[6] = v[5]; v[5] = v[4]; v[4] = iz0(v[3], v[4]); v[3] = iz0(v[2], v[3]); v[7] = v[0]; break;
|
|
case 382: vc = 7; v[6] = v[5]; v[5] = iz0(v[4], v[5]); v[4] = iz0(v[3], v[4]); v[7] = v[0]; break;
|
|
#endif
|
|
#if MIN_POLYGON_VERTEX_COUNT_BEFORE_CLIPPING <= 7 && MAX_POLYGON_VERTEX_COUNT >= 8
|
|
case 7: vc = 0; break;
|
|
case 1023: vc = 7; v[7] = v[0]; break;
|
|
case 15: vc = 3; v[1] = iz0(v[0], v[1]); v[2] = iz0(v[6], v[0]); v[3] = v[0]; break;
|
|
case 23: vc = 3; v[0] = iz0(v[0], v[1]); v[2] = iz0(v[1], v[2]); v[3] = v[0]; break;
|
|
case 39: vc = 3; v[0] = iz0(v[2], v[3]); v[1] = iz0(v[1], v[2]); v[3] = v[0]; break;
|
|
case 71: vc = 3; v[0] = v[3]; v[1] = iz0(v[3], v[4]); v[2] = iz0(v[2], v[3]); break;
|
|
case 135: vc = 3; v[0] = iz0(v[3], v[4]); v[1] = v[4]; v[2] = iz0(v[4], v[5]); v[3] = v[0]; break;
|
|
case 263: vc = 3; v[0] = iz0(v[4], v[5]); v[1] = v[5]; v[2] = iz0(v[5], v[6]); v[3] = v[0]; break;
|
|
case 519: vc = 3; v[1] = v[6]; v[2] = iz0(v[6], v[0]); v[0] = iz0(v[5], v[6]); v[3] = v[0]; break;
|
|
case 31: vc = 4; v[2] = iz0(v[1], v[2]); v[3] = iz0(v[6], v[0]); v[4] = v[0]; break;
|
|
case 55: vc = 4; v[0] = iz0(v[0], v[1]); v[3] = iz0(v[2], v[3]); v[4] = v[0]; break;
|
|
case 103: vc = 4; v[0] = iz0(v[3], v[4]); v[1] = iz0(v[1], v[2]); v[4] = v[0]; break;
|
|
case 199: vc = 4; v[0] = v[4]; v[1] = iz0(v[4], v[5]); v[2] = iz0(v[2], v[3]); break;
|
|
case 391: vc = 4; v[0] = v[4]; v[1] = v[5]; v[2] = iz0(v[5], v[6]); v[3] = iz0(v[3], v[4]); break;
|
|
case 775: vc = 4; v[1] = v[5]; v[2] = v[6]; v[3] = iz0(v[6], v[0]); v[0] = iz0(v[4], v[5]); v[4] = v[0]; break;
|
|
case 527: vc = 4; v[1] = iz0(v[0], v[1]); v[2] = iz0(v[5], v[6]); v[3] = v[6]; v[4] = v[0]; break;
|
|
case 63: vc = 5; v[3] = iz0(v[2], v[3]); v[4] = iz0(v[6], v[0]); v[5] = v[0]; break;
|
|
case 119: vc = 5; v[0] = iz0(v[0], v[1]); v[4] = iz0(v[3], v[4]); v[5] = v[0]; break;
|
|
case 231: vc = 5; v[0] = iz0(v[4], v[5]); v[1] = iz0(v[1], v[2]); v[5] = v[0]; break;
|
|
case 455: vc = 5; v[0] = v[5]; v[1] = iz0(v[5], v[6]); v[2] = iz0(v[2], v[3]); break;
|
|
case 903: vc = 5; v[1] = v[6]; v[2] = iz0(v[6], v[0]); v[0] = v[5]; v[3] = iz0(v[3], v[4]); break;
|
|
case 783: vc = 5; v[1] = iz0(v[0], v[1]); v[2] = iz0(v[4], v[5]); v[3] = v[5]; v[4] = v[6]; v[5] = v[0]; break;
|
|
case 543: vc = 5; v[2] = iz0(v[1], v[2]); v[3] = iz0(v[5], v[6]); v[4] = v[6]; v[5] = v[0]; break;
|
|
case 127: vc = 6; v[4] = iz0(v[3], v[4]); v[5] = iz0(v[6], v[0]); v[6] = v[0]; break;
|
|
case 247: vc = 6; v[0] = iz0(v[0], v[1]); v[5] = iz0(v[4], v[5]); v[6] = v[0]; break;
|
|
case 487: vc = 6; v[0] = iz0(v[5], v[6]); v[1] = iz0(v[1], v[2]); v[6] = v[0]; break;
|
|
case 967: vc = 6; v[1] = iz0(v[6], v[0]); v[0] = v[6]; v[2] = iz0(v[2], v[3]); break;
|
|
case 911: vc = 6; v[2] = iz0(v[0], v[1]); v[1] = v[0]; v[0] = v[6]; v[3] = iz0(v[3], v[4]); break;
|
|
case 799: vc = 6; v[2] = iz0(v[1], v[2]); v[3] = iz0(v[4], v[5]); v[4] = v[5]; v[5] = v[6]; v[6] = v[0]; break;
|
|
case 575: vc = 6; v[3] = iz0(v[2], v[3]); v[4] = iz0(v[5], v[6]); v[5] = v[6]; v[6] = v[0]; break;
|
|
case 255: vc = 7; v[5] = iz0(v[4], v[5]); v[6] = iz0(v[6], v[0]); v[7] = v[0]; break;
|
|
case 503: vc = 7; v[0] = iz0(v[0], v[1]); v[6] = iz0(v[5], v[6]); v[7] = v[0]; break;
|
|
case 999: vc = 7; v[0] = iz0(v[6], v[0]); v[1] = iz0(v[1], v[2]); v[7] = v[0]; break;
|
|
case 975: vc = 7; v[1] = iz0(v[0], v[1]); v[2] = iz0(v[2], v[3]); v[7] = v[0]; break;
|
|
case 927: vc = 7; v[2] = iz0(v[1], v[2]); v[3] = iz0(v[3], v[4]); v[7] = v[0]; break;
|
|
case 831: vc = 7; v[3] = iz0(v[2], v[3]); v[4] = iz0(v[4], v[5]); v[7] = v[0]; break;
|
|
case 639: vc = 7; v[4] = iz0(v[3], v[4]); v[5] = iz0(v[5], v[6]); v[7] = v[0]; break;
|
|
#endif
|
|
#if MIN_POLYGON_VERTEX_COUNT_BEFORE_CLIPPING <= 7 && MAX_POLYGON_VERTEX_COUNT == 8
|
|
case 511: vc = 8; v[7] = iz0(v[6], v[0]); v[6] = iz0(v[5], v[6]); break;
|
|
case 1015: vc = 8; v[7] = iz0(v[6], v[0]); v[0] = iz0(v[0], v[1]); break;
|
|
case 1007: vc = 8; v[7] = v[0]; v[0] = iz0(v[0], v[1]); v[1] = iz0(v[1], v[2]); break;
|
|
case 991: vc = 8; v[7] = v[0]; v[0] = v[1]; v[1] = iz0(v[1], v[2]); v[2] = iz0(v[2], v[3]); break;
|
|
case 959: vc = 8; v[7] = v[6]; v[6] = v[5]; v[5] = v[4]; v[4] = iz0(v[3], v[4]); v[3] = iz0(v[2], v[3]); break;
|
|
case 895: vc = 8; v[7] = v[6]; v[6] = v[5]; v[5] = iz0(v[4], v[5]); v[4] = iz0(v[3], v[4]); break;
|
|
case 767: vc = 8; v[7] = v[6]; v[6] = iz0(v[5], v[6]); v[5] = iz0(v[4], v[5]); break;
|
|
#elif MIN_POLYGON_VERTEX_COUNT_BEFORE_CLIPPING <= 7 && MAX_POLYGON_VERTEX_COUNT > 8
|
|
case 511: vc = 8; v[7] = iz0(v[6], v[0]); v[6] = iz0(v[5], v[6]); v[8] = v[0]; break;
|
|
case 1015: vc = 8; v[7] = iz0(v[6], v[0]); v[0] = iz0(v[0], v[1]); v[8] = v[0]; break;
|
|
case 1007: vc = 8; v[7] = v[0]; v[0] = iz0(v[0], v[1]); v[1] = iz0(v[1], v[2]); v[8] = v[0]; break;
|
|
case 991: vc = 8; v[7] = v[0]; v[0] = v[1]; v[1] = iz0(v[1], v[2]); v[2] = iz0(v[2], v[3]); v[8] = v[0]; break;
|
|
case 959: vc = 8; v[7] = v[6]; v[6] = v[5]; v[5] = v[4]; v[4] = iz0(v[3], v[4]); v[3] = iz0(v[2], v[3]); v[8] = v[0]; break;
|
|
case 895: vc = 8; v[7] = v[6]; v[6] = v[5]; v[5] = iz0(v[4], v[5]); v[4] = iz0(v[3], v[4]); v[8] = v[0]; break;
|
|
case 767: vc = 8; v[7] = v[6]; v[6] = iz0(v[5], v[6]); v[5] = iz0(v[4], v[5]); v[8] = v[0]; break;
|
|
#endif
|
|
// AUTOGENERATED PART END
|
|
default:
|
|
// This should never happen. Just pretend the polygon is below the
|
|
// horizon.
|
|
vc = 0;
|
|
break;
|
|
};
|
|
return vc;
|
|
}
|