MCPcopy Create free account
hub / github.com/OpenStarbound/OpenStarbound / splitPoly

Method splitPoly

source/base/StarWorldGeometry.cpp:130–187  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

128}
129
130StaticList<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}

Callers

nothing calls this directly

Calls 8

sidesMethod · 0.80
sideMethod · 0.80
isNullMethod · 0.45
minMethod · 0.45
maxMethod · 0.45
intersectionMethod · 0.45
addMethod · 0.45
translateMethod · 0.45

Tested by

no test coverage detected