/// <summary> /// Нужно для случая, когда нужно скопировать часть картинки из текстуры1 в sheet2d текстуру. /// В данном случае текстура1=текстура фреймбуфера1 /// </summary> /// <param name="sprite"></param> /// <returns></returns> public Sprite AddSprite(Sprite sprite) { Sprite rect = Allocate(new Size(Convert.ToInt32(sprite.Size.X), Convert.ToInt32(sprite.Size.Y)), sprite.ZRamp, sprite.Offset, TextureChannel.RGBA); byte[] spritedata = sprite.Sheet.GetData(); //тут беруться данные из текстуры1 из видеокарты. byte[] src = new byte[rect.Bounds.Height * rect.Bounds.Width * 4]; //4byte sprite var destskip = (sprite.Sheet.Size.Width - sprite.Bounds.Width) * 4; //destskip = 0; // +0 так как перевертывание только по Y оси. Поэтому смещаться от левой оси не нужно. // тут умножается на sprite.Sheet.Size.Width,но это дает всегда 0 смещение от левого края. //var srcOffset = sprite.Sheet.Size.Width * (sprite.Sheet.Size.Height - sprite.Bounds.Height) * 4 + 0; var srcOffset = sprite.Sheet.Size.Width * (sprite.Sheet.Size.Height - 1) * 4 + sprite.Bounds.Width * 4; //srcOffset = 0; var destOffset = 0; for (var j = 0; j < rect.Bounds.Height; j++) { for (var i = 0; i < rect.Bounds.Width; i++) // после прогона в количестве равному ширине в пикселях { //нужно записывать в ARGB, так как FastCopyIntoSprite2 работает в ARGB -1=A,-2=R,-3=G,0=B src[destOffset + 3] = spritedata[srcOffset]; src[destOffset + 2] = spritedata[srcOffset - 3]; src[destOffset + 1] = spritedata[srcOffset - 2]; src[destOffset] = spritedata[srcOffset - 1]; destOffset += 4; srcOffset -= 4; } srcOffset -= destskip; } int current = 0, flipped = 0; int w = rect.Bounds.Width; //перевертываем вокруг Y оси byte[] src2 = new byte[rect.Bounds.Height * rect.Bounds.Width * 4]; for (int y = 0; y < rect.Bounds.Height; y++) { for (int x = 0; x < rect.Bounds.Width; x++) { current = y * rect.Bounds.Width * 4 + x * 4; flipped = y * rect.Bounds.Width * 4 + (w - x) * 4 - 4; //начало flipper падает на конец 4ки, нужно добавить -4 , чтобы на начало for (int i = 0; i < 4; i++) { src2[flipped + i] = src[current + i]; } } //current += destskip; ненужен, так как src массив включает только картинку } //нужно скопировать из spritedata по правильному смещению в src Util.FastCopyIntoSprite2(rect, src2); currentSheet2D.CommitBufferedData(); return(rect); }