| 128 | } |
| 129 | |
| 130 | StaticList<PolyF, 2> WorldGeometry::splitPoly(PolyF const& poly) const { |
| 131 | if (poly.isNull() || m_size[0] == 0) |
| 132 | return {poly}; |
| 133 | |
| 134 | Array<PolyF, 2> res; |
| 135 | bool polySelect = false; |
| 136 | |
| 137 | Line2F worldBoundRight = {Vec2F(m_size[0], 0), Vec2F(m_size[0], 1)}; |
| 138 | Line2F worldBoundLeft = {Vec2F(0, 0), Vec2F(0, 1)}; |
| 139 | |
| 140 | for (unsigned i = 0; i < poly.sides(); i++) { |
| 141 | Line2F segment = poly.side(i); |
| 142 | if ((segment.min()[0] < 0) ^ (segment.max()[0] < 0)) { |
| 143 | Vec2F worldCorrect = {(float)m_size[0], 0}; |
| 144 | Vec2F intersect = segment.intersection(worldBoundLeft, true).point; |
| 145 | if (segment.min()[0] < 0) { |
| 146 | res[polySelect].add(segment.min() + worldCorrect); |
| 147 | res[polySelect].add(Vec2F(m_size[0], intersect[1])); |
| 148 | polySelect = !polySelect; |
| 149 | res[polySelect].add(Vec2F(0, intersect[1])); |
| 150 | } else { |
| 151 | res[polySelect].add(segment.min()); |
| 152 | res[polySelect].add(Vec2F(0, intersect[1])); |
| 153 | polySelect = !polySelect; |
| 154 | res[polySelect].add(Vec2F(m_size[0], intersect[1])); |
| 155 | } |
| 156 | } else if ((segment.min()[0] > m_size[0]) ^ (segment.max()[0] > m_size[0])) { |
| 157 | Vec2F worldCorrect = {(float)m_size[0], 0}; |
| 158 | Vec2F intersect = segment.intersection(worldBoundRight, true).point; |
| 159 | if (segment.min()[0] > m_size[0]) { |
| 160 | res[polySelect].add(segment.min() - worldCorrect); |
| 161 | res[polySelect].add(Vec2F(0, intersect[1])); |
| 162 | polySelect = !polySelect; |
| 163 | res[polySelect].add(Vec2F(m_size[0], intersect[1])); |
| 164 | } else { |
| 165 | res[polySelect].add(segment.min()); |
| 166 | res[polySelect].add(Vec2F(m_size[0], intersect[1])); |
| 167 | polySelect = !polySelect; |
| 168 | res[polySelect].add(Vec2F(0, intersect[1])); |
| 169 | } |
| 170 | } else { |
| 171 | if (segment.min()[0] < 0) { |
| 172 | res[polySelect].add(segment.min() + Vec2F((float)m_size[0], 0)); |
| 173 | } else if (segment.min()[0] > m_size[0]) { |
| 174 | res[polySelect].add(segment.min() - Vec2F((float)m_size[0], 0)); |
| 175 | } else { |
| 176 | res[polySelect].add(segment.min()); |
| 177 | } |
| 178 | } |
| 179 | } |
| 180 | |
| 181 | if (res[1].isNull()) |
| 182 | return {res[0]}; |
| 183 | if (res[0].isNull()) |
| 184 | return {res[1]}; |
| 185 | else |
| 186 | return {res[0], res[1]}; |
| 187 | } |