public static void PushEdge(this Center c, Edge e, DataFactory factory) { var v1 = e.VoronoiStart; var v2 = e.VoronoiEnd; Vector3 v11 = Vector3.zero, v22 = Vector3.zero; Edge e11 = null; foreach (var oe in v1.Protrudes.Values) { var other = oe.OtherCorner(v1); if (other != v2 && other.Touches.ContainsKey(c.Point)) { if (oe.Props.Has(ObjectProp.River)) { v11 = v1.Point + (c.Point - v1.Point).normalized * 20; } else { v11 = v1.Point + (other.Point - v1.Point).normalized * 20; e11 = oe; } } } Edge e22 = null; foreach (var oe in v2.Protrudes.Values) { var other = oe.OtherCorner(v2); if (other != v1 && other.Touches.ContainsKey(c.Point)) { if (oe.Props.Has(ObjectProp.River)) { v22 = v2.Point + (c.Point - v2.Point).normalized * 20; } else { v22 = v2.Point + (other.Point - v2.Point).normalized * 20; e22 = oe; } } } c.Corners.Remove(v1.Point); c.Corners.Remove(v2.Point); var nc11 = factory.CornerFactory(v11); nc11.Normal = Vector3.up; if (!nc11.Touches.ContainsKey(c.Point)) { nc11.Touches.Add(c.Point, c); } if (!c.Corners.ContainsKey(nc11.Point)) { c.Corners.Add(nc11.Point, nc11); } var nc22 = factory.CornerFactory(v22); nc22.Normal = Vector3.up; if (!nc22.Touches.ContainsKey(c.Point)) { nc22.Touches.Add(c.Point, c); } if (!c.Corners.ContainsKey(nc22.Point)) { c.Corners.Add(nc22.Point, nc22); } c.Borders.Remove(e.Midpoint); var ee = factory.EdgeFactory(nc11, nc22, c, c); if (!nc11.Protrudes.ContainsKey(ee.Midpoint)) { nc11.Protrudes.Add(ee.Midpoint, ee); } if (!nc22.Protrudes.ContainsKey(ee.Midpoint)) { nc22.Protrudes.Add(ee.Midpoint, ee); } if (!c.Borders.ContainsKey(ee.Midpoint)) { c.Borders.Add(ee.Midpoint, ee); } if (e11 != null && nc11.Point != Vector3.zero) { Edge ne = null; if (e11.VoronoiStart == v1) { ne = factory.EdgeFactory(nc11, e11.VoronoiEnd, e11.DelaunayStart, e11.DelaunayEnd); e11.VoronoiEnd.Protrudes.Remove(e11.Midpoint); if (!e11.VoronoiEnd.Protrudes.ContainsKey(ne.Midpoint)) { e11.VoronoiEnd.Protrudes.Add(ne.Midpoint, ne); } } else { ne = factory.EdgeFactory(e11.VoronoiStart, nc11, e11.DelaunayStart, e11.DelaunayEnd); e11.VoronoiStart.Protrudes.Remove(e11.Midpoint); if (!e11.VoronoiStart.Protrudes.ContainsKey(ne.Midpoint)) { e11.VoronoiStart.Protrudes.Add(ne.Midpoint, ne); } } if (!nc11.Protrudes.ContainsKey(ne.Midpoint)) { nc11.Protrudes.Add(ne.Midpoint, ne); } if (!c.Borders.ContainsKey(ne.Midpoint)) { c.Borders.Add(ne.Midpoint, ne); } c.Borders.Remove(e11.Midpoint); } if (e22 != null && nc22.Point != Vector3.zero) { Edge ne = null; if (e22.VoronoiStart == v2) { ne = factory.EdgeFactory(nc22, e22.VoronoiEnd, e22.DelaunayStart, e22.DelaunayEnd); e22.VoronoiEnd.Protrudes.Remove(e22.Midpoint); if (!e22.VoronoiEnd.Protrudes.ContainsKey(ne.Midpoint)) { e22.VoronoiEnd.Protrudes.Add(ne.Midpoint, ne); } } else { ne = factory.EdgeFactory(e22.VoronoiStart, nc22, e22.DelaunayStart, e22.DelaunayEnd); e22.VoronoiStart.Protrudes.Remove(e22.Midpoint); if (!e22.VoronoiStart.Protrudes.ContainsKey(ne.Midpoint)) { e22.VoronoiStart.Protrudes.Add(ne.Midpoint, ne); } } if (!nc22.Protrudes.ContainsKey(ne.Midpoint)) { nc22.Protrudes.Add(ne.Midpoint, ne); } if (!c.Borders.ContainsKey(ne.Midpoint)) { c.Borders.Add(ne.Midpoint, ne); } c.Borders.Remove(e22.Midpoint); } }