// ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT
using System;
using System.Drawing;
using ClassicalSharp.GraphicsAPI;
#if ANDROID
using Android.Graphics;
#endif
namespace ClassicalSharp {
/// Represents a 2D packed texture atlas, specifically for terrain.png.
public class TerrainAtlas2D : IDisposable {
public const int ElementsPerRow = 16, RowsCount = 16;
public const float invElementSize = 1 / 16f;
public Bitmap AtlasBitmap;
public int elementSize;
IGraphicsApi gfx;
IDrawer2D drawer;
public TerrainAtlas2D( IGraphicsApi gfx, IDrawer2D drawer ) {
this.gfx = gfx;
this.drawer = drawer;
}
/// Updates the underlying atlas bitmap, fields, and texture.
public void UpdateState( BlockInfo info, Bitmap bmp ) {
if( !Platform.Is32Bpp( bmp ) ) {
Utils.LogDebug( "Converting terrain atlas to 32bpp image" );
drawer.ConvertTo32Bpp( ref bmp );
}
AtlasBitmap = bmp;
elementSize = bmp.Width / ElementsPerRow;
using( FastBitmap fastBmp = new FastBitmap( bmp, true, true ) )
info.RecalculateSpriteBB( fastBmp );
}
/// Creates a new texture that contains the tile at the specified index.
public int LoadTextureElement( int index ) {
int size = elementSize;
using( FastBitmap atlas = new FastBitmap( AtlasBitmap, true, true ) )
using( Bitmap bmp = Platform.CreateBmp( size, size ) )
using( FastBitmap dst = new FastBitmap( bmp, true, false ) )
{
int x = index % ElementsPerRow, y = index / ElementsPerRow;
FastBitmap.MovePortion( x * size, y * size, 0, 0, atlas, dst, size );
return gfx.CreateTexture( dst, true );
}
}
/// Disposes of the underlying atlas bitmap and texture.
public void Dispose() {
if( AtlasBitmap != null )
AtlasBitmap.Dispose();
}
}
}