// Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
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) {
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();
}
}
}