+Vector<float> World::NormalAt(Vector<float> pos) const {
+ constexpr Vector<float> check[] = {
+ { 0, -2 },
+ { 0.765367, -1.84776 },
+ { 1.41421, -1.41421 },
+ { 1.84776, -0.765367 },
+ { 2, 0 },
+ { 1.84776, 0.765367 },
+ { 1.41421, 1.41421 },
+ { 0.765367, 1.84776 },
+ { 0, 2 },
+ { -0.765367, 1.84776 },
+ { -1.41421, 1.41421 },
+ { -1.84776, 0.765367 },
+ { -2, 0 },
+ { -1.84776, -0.765367 },
+ { -1.41421, -1.41421 },
+ { -0.765367, -1.84776 },
+ };
+ Vector<float> normal;
+ for (auto v : check) {
+ if (MassAt(pos + v) == 0) {
+ normal += v;
+ }
+ }
+ return Norm(normal);
+}
+
+//Vector<float> World::NormalAt(Vector<float> pos) const {
+// Vector<int> begin(pos - Vector<float>(3, 3));
+// Vector<int> end(pos + Vector<float>(3, 3));
+//
+// Vector<float> normal;
+// for (Vector<int> cur(begin); cur.y < end.y; ++cur.y) {
+// for (cur.x = begin.x; cur.x < end.x; ++cur.x) {
+// if (IsSurface(cur) > 0) {
+// const Vector<float> dir = pos - Vector<float>(cur);
+// normal += Rotate90(dir);
+// }
+// }
+// }
+//
+// return Norm(normal);
+//}
+
+bool World::IsSurface(Vector<int> pos) const {
+ return MassAt(pos) > 0 && (
+ MassAt(pos - Vector<int>(1, 0)) == 0 ||
+ MassAt(pos + Vector<int>(1, 0)) == 0 ||
+ MassAt(pos - Vector<int>(0, 1)) == 0 ||
+ MassAt(pos + Vector<int>(0, 1)) == 0);
+}
+