void ShuffleBlockPositions_Block(TTexturePointBlock Block) { int First = Block.DataTextureIndexOffset; int Count = Block.PointCount; var PositionPixels = BlockPositions.GetPixels(); var ColourPixels = BlockColours.GetPixels(); // grab a copy of all the pixels var BlockPositionPixels = new List <Color>(); var BlockColourPixels = new List <Color>(); for (int i = 0; i < Count; i++) { BlockPositionPixels.Add(PositionPixels [First + i]); BlockColourPixels.Add(ColourPixels [First + i]); } // write back pixels at random removing the used ones as we go for (int i = 0; i < Count; i++) { var RandomIndex = Random.Range(0, BlockPositionPixels.Count - 1); PositionPixels [First + i] = BlockPositionPixels [RandomIndex]; ColourPixels [First + i] = BlockColourPixels [RandomIndex]; BlockPositionPixels.RemoveAt(RandomIndex); BlockColourPixels.RemoveAt(RandomIndex); } BlockPositions.SetPixels(PositionPixels); BlockPositions.Apply(); BlockColours.SetPixels(ColourPixels); BlockColours.Apply(); }
void AddBlock(Bounds bounds, List <Color> NewPositionData, List <Color> NewColourData) { if (NewPositionData.Count == 0) { return; } // auto split while (NewPositionData.Count > BlockPointSplit) { // pop top and add var TopPositionData = NewPositionData.GetRange(0, BlockPointSplit); var TopColourData = NewColourData.GetRange(0, BlockPointSplit); NewPositionData.RemoveRange(0, BlockPointSplit); NewColourData.RemoveRange(0, BlockPointSplit); AddBlock(bounds, TopPositionData, TopColourData); } GrowData(NewPositionData.Count); var Block = new TTexturePointBlock(); Block.DataTextureIndexOffset = GetUsedPointCount(); Block.BoundingBox = bounds; // grab current data to inject into var PositionsWritten = InsertPixels(BlockPositions, NewPositionData, Block.DataTextureIndexOffset); var ColoursWritten = InsertPixels(BlockColours, NewColourData, Block.DataTextureIndexOffset); if (PositionsWritten != ColoursWritten) { throw new System.Exception("Expected positonswritten(" + PositionsWritten + ") to match colours written (" + ColoursWritten + ")"); } Block.PointCount = PositionsWritten; Blocks.Add(Block); }