Пример #1
0
    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();
    }
Пример #2
0
    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);
    }