public GLTexture(IntPtr imgData, TextureProperties properties)
{
uint glTexName;
bool compressed = properties.TextureFormat.Compressed;
GL.GenTextures(1, out glTexName);
GL.BindTexture(TextureTarget.Texture2D, glTexName);
#if __WINDOWS__
GL.TexStorage2D(TextureTarget2d.Texture2D,
#elif __ANDROID__
GL.TexStorage2D(TextureTarget2D.Texture2D,
#endif
properties.NumMipmaps + 1, // mipmap level, min 1
properties.TextureFormat.InternalFormat,
properties.Width,
properties.Height);
if (!compressed)
{
if (imgData != IntPtr.Zero)
{
GL.TexSubImage2D(TextureTarget.Texture2D,
0, // level
0, // xOffset
0, // yOffset
properties.Width,
properties.Height,
properties.TextureFormat.PixelFormat,
properties.TextureFormat.PixelType,
imgData);
}
}
else
{
// TODO this is not tested!
if (imgData != IntPtr.Zero)
{
int size = Math.Max(32, properties.Width * properties.Height * properties.TextureFormat.BitsPerPixel / 8);
GL.CompressedTexSubImage2D(TextureTarget.Texture2D,
0, // level
0, // xOffset
0, // yOffset
properties.Width,
properties.Height,
properties.TextureFormat.PixelFormat,
size,
imgData);
}
}
if (properties.NumMipmaps > 0)
{
#if __WINDOWS__
GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);
#elif __ANDROID__
GL.GenerateMipmap(TextureTarget.Texture2D);
#endif
}
bool containsMipmaps = properties.NumMipmaps > 0;
Init(glTexName, properties.Width, properties.Height, containsMipmaps, properties.Scale, properties.PremultipliedAlpha);
}