Texture2D.GetData fails to return pixel colour data
- by Chris Charabaruk
Because I'm using sprite sheets instead of an individual texture per sprite, I need to pass in a Rectangle when calling Texture2D.GetData() in my collision detection for per-pixel tests. Unfortunately, without fail I get an ArgumentException percolated down from an internal method inside the Texture (not Texture2D) class.
My code for getting the texture data looks like this:
public override Color[] GetPixelData()
{
Color[] data = new Color[(int)size.Product()];
Rectangle rect = new Rectangle(hframe * (int)size.X, vframe * (int)size.Y, (int)size.X, (int)size.Y);
#if DEBUG
if (sprite.Bounds.Contains(rect) && sprite.Format == SurfaceFormat.Color)
#endif
sprite.GetData(0, rect, data, 0, 1);
return data;
}
Even with the check to ensure I'm grabbing a valid rectangle and that the texture format matches what I'm trying to get, I still get that exception, claiming "The size of the data passed in is too large or too small for this resource." Unfortunately, the debugger won't let me check the locals within the Texture.ValidateTotalSize() method where the exception originates.
Has anyone else had this problem and knows how to fix it? I'm relying on AABB testing only for now, but that doesn't really work for some of my game's entities due to odd shapes, rotation and scaling.