private void AddRightEdges(ActiveRegion regUp, MeshUtils.Edge eFirst, MeshUtils.Edge eLast, MeshUtils.Edge eTopLeft, bool cleanUp) { bool flag = true; MeshUtils.Edge edge = eFirst; do { AddRegionBelow(regUp, edge._Sym); edge = edge._Onext; }while (edge != eLast); if (eTopLeft == null) { eTopLeft = RegionBelow(regUp)._eUp._Rprev; } ActiveRegion activeRegion = regUp; MeshUtils.Edge edge2 = eTopLeft; while (true) { ActiveRegion activeRegion2 = RegionBelow(activeRegion); edge = activeRegion2._eUp._Sym; if (edge._Org != edge2._Org) { break; } if (edge._Onext != edge2) { _mesh.Splice(edge._Oprev, edge); _mesh.Splice(edge2._Oprev, edge); } activeRegion2._windingNumber = activeRegion._windingNumber - edge._winding; activeRegion2._inside = Geom.IsWindingInside(_windingRule, activeRegion2._windingNumber); activeRegion._dirty = true; if (!flag && CheckForRightSplice(activeRegion)) { Geom.AddWinding(edge, edge2); DeleteRegion(activeRegion); _mesh.Delete(edge2); } flag = false; activeRegion = activeRegion2; edge2 = edge; } activeRegion._dirty = true; if (cleanUp) { WalkDirtyRegions(activeRegion); } }
private void ComputeWinding(ActiveRegion reg) { reg._windingNumber = RegionAbove(reg)._windingNumber + reg._eUp._winding; reg._inside = Geom.IsWindingInside(_windingRule, reg._windingNumber); }