public bool RemoveWeld(WeldStripPosition position, int terrainId)
        {
            var column = _stripColumns[position.ColumnIndex];
            var strip  = column.GetSegment(position.StripInColumnIndex);

            bool removeStrip = false;

            if (strip.Followers.Any(c => c.TerrainId == terrainId))
            {
                strip.Followers.RemoveAll(c => c.TerrainId == terrainId);
                if (!strip.Followers.Any())
                {
                    removeStrip = true; // no followers - strip can be removed!
                }
            }
            else if (strip.Leader.TerrainId == terrainId)
            {
                removeStrip = true;
            }

            if (removeStrip)
            {
                column.RemoveStrip(position.StripInColumnIndex);
                return(true);
            }
            else
            {
                return(false);
            }
        }
        public TerrainWeldUvs AddStipSegment(WeldStripPosition stripPosition, StripSide follower)
        {
            var strip = _stripColumns[stripPosition.ColumnIndex].GetSegment(stripPosition.StripInColumnIndex);

            strip.Followers.Add(follower);

            var leader           = strip.Leader;
            var leaderSideInfo   = CreateDrawingSideInfo(leader, follower.NormalizedMarginUvOfTerrain);
            var followerSideInfo = CreateDrawingSideInfo(follower, new Vector2(0, 1));

            var donorSide    = leaderSideInfo;
            var acceptorSide = followerSideInfo;

            if (follower.WeldSideType.IsDonorSide())
            {
                donorSide    = followerSideInfo;
                acceptorSide = leaderSideInfo;
            }

            var weldRange = CalculateWeldRange(stripPosition.StripInColumnIndex, follower.NormalizedMarginUvOfTerrain);
            WeldOnTextureInfo weldInfo = new WeldOnTextureInfo()
            {
                ColumnIndex = stripPosition.ColumnIndex,
                WeldRange   = weldRange
            };

            acceptorSide.SamplingDistance = weldInfo.WeldRange.Length /
                                            (acceptorSide.FullLodSidePixelsRange.Length - 1);
            donorSide.SamplingDistance = weldInfo.WeldRange.Length / (donorSide.FullLodSidePixelsRange.Length - 1);

            _weldingExecutor.RenderWeld(new WeldTextureDrawingOrder()
            {
                FirstSideInfo     = acceptorSide,
                SecondSideInfo    = donorSide,
                WeldOnTextureInfo = weldInfo
            });

            return(TerrainWeldUvs.CreateFrom(follower.WeldSideType,
                                             CreateNormalizedWeldRange(weldRange, stripPosition.ColumnIndex)));
        }