// 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 . /*! 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; }