Level generation bugfixes:

- cell bodies match the shape of the cell (triangulation didn't work correctly because the center of the cell was given in display units while vertices were in sim units)
- ignoring graph edges whose length is zero when generating cells (fixes "invalid left/right normal" errors)
This commit is contained in:
Regalis
2016-10-11 18:18:54 +03:00
parent 9dfba4921e
commit d21c6674ea
+13 -13
View File
@@ -185,6 +185,8 @@ namespace Barotrauma
foreach (GraphEdge ge in graphEdges) foreach (GraphEdge ge in graphEdges)
{ {
if (ge.point1 == ge.point2) continue;
for (int i = 0; i < 2; i++) for (int i = 0; i < 2; i++)
{ {
Site site = (i == 0) ? ge.site1 : ge.site2; Site site = (i == 0) ? ge.site1 : ge.site2;
@@ -408,31 +410,29 @@ namespace Barotrauma
bodyPoints[i] = ConvertUnits.ToSimUnits(bodyPoints[i]); bodyPoints[i] = ConvertUnits.ToSimUnits(bodyPoints[i]);
} }
if (cell.CellType == CellType.Empty) continue; if (cell.CellType == CellType.Empty) continue;
triangles = MathUtils.TriangulateConvexHull(bodyPoints, cell.Center); triangles = MathUtils.TriangulateConvexHull(bodyPoints, ConvertUnits.ToSimUnits(cell.Center));
Body edgeBody = new Body(GameMain.World); Body cellBody = new Body(GameMain.World);
for (int i = 0; i < triangles.Count; i++) for (int i = 0; i < triangles.Count; i++)
{ {
if (triangles[i][0].Y == triangles[i][1].Y && triangles[i][0].Y == triangles[i][2].Y) continue; if (triangles[i][0].Y == triangles[i][1].Y && triangles[i][0].Y == triangles[i][2].Y) continue;
if (triangles[i][0].X == triangles[i][1].X && triangles[i][0].X == triangles[i][2].X) continue; if (triangles[i][0].X == triangles[i][1].X && triangles[i][0].X == triangles[i][2].X) continue;
if (Vector2.DistanceSquared(triangles[i][0], triangles[i][1]) < 0.1f) continue;
if (Vector2.DistanceSquared(triangles[i][1], triangles[i][2]) < 0.1f) continue;
Vertices bodyVertices = new Vertices(triangles[i]); Vertices bodyVertices = new Vertices(triangles[i]);
FixtureFactory.AttachPolygon(bodyVertices, 5.0f, edgeBody); FixtureFactory.AttachPolygon(bodyVertices, 5.0f, cellBody);
} }
edgeBody.UserData = cell; cellBody.UserData = cell;
edgeBody.SleepingAllowed = false; cellBody.SleepingAllowed = false;
edgeBody.BodyType = BodyType.Kinematic; cellBody.BodyType = BodyType.Kinematic;
edgeBody.CollisionCategories = Physics.CollisionLevel; cellBody.CollisionCategories = Physics.CollisionLevel;
cell.body = edgeBody; cell.body = cellBody;
bodies.Add(edgeBody); bodies.Add(cellBody);
} }
return bodies; return bodies;
@@ -489,7 +489,7 @@ namespace Barotrauma
if (!MathUtils.IsValid(leftNormal)) if (!MathUtils.IsValid(leftNormal))
{ {
#if DEBUG #if DEBUG
DebugConsole.ThrowError("Invalid right normal"); DebugConsole.ThrowError("Invalid left normal");
#endif #endif
if (cell.body != null) if (cell.body != null)
{ {