Generate fallback entries for missing block textures

This commit is contained in:
Simon Lübeß
2021-03-25 20:43:43 +01:00
parent 1d7029eb0f
commit 0f62637662
+29 -2
View File
@@ -8,11 +8,13 @@ namespace Sandbox.VoxelFun
{
class TextureAtlas : Texture2D
{
typealias TexEntry = (Color* data, uint32 width, uint32 height, BlockTexture blockTex);
public this(GraphicsContext context, List<BlockTexture> textures) : base(context)
{
// Todo: rewrite this garbage algorithm
List<(Color* data, uint32 width, uint32 height, BlockTexture blockTex)> textureDatas = new .(textures.Count);
List<TexEntry> textureDatas = new .(textures.Count);
defer
{
for(let item in textureDatas)
@@ -26,6 +28,11 @@ namespace Sandbox.VoxelFun
uint32 maxWidth = 0;
uint32 maxHeight = 0;
Color[4] nullColors = .(.HotPink, .Black, .Black, .HotPink);
BlockTexture nullBT = scope .("NULL");
TexEntry nullTexture = (&nullColors, 2, 2, nullBT);
bool nullTexWriten = false;
for(let texture in textures)
{
(Color* data, uint32 width, uint32 height, BlockTexture blockTex) tex;
@@ -57,7 +64,8 @@ namespace Sandbox.VoxelFun
uint32 currentX = 0;
uint32 currentY = 0;
for(let texture in textureDatas)
/// Copies the data of the given texture into the atlas
void CopyTextureIntoAtlas(TexEntry texture)
{
texture.blockTex.[Friend]_atlasStart = .((float)currentX / (float)textureWidth, (float)currentY / (float)textureHeight);
texture.blockTex.[Friend]_atlasSize = .((float)texture.width / (float)textureWidth, (float)texture.height / (float)textureHeight);
@@ -76,6 +84,25 @@ namespace Sandbox.VoxelFun
}
}
for(let texture in textureDatas)
{
if(texture.data != null)
{
CopyTextureIntoAtlas(texture);
}
else
{
if(!nullTexWriten)
{
CopyTextureIntoAtlas(nullTexture);
nullTexWriten = true;
}
texture.blockTex.[Friend]_atlasStart = nullTexture.blockTex.[Friend]_atlasStart;
texture.blockTex.[Friend]_atlasSize = nullTexture.blockTex.[Friend]_atlasSize;
}
}
Texture2DDesc desc;
desc.Width = textureWidth;
desc.Height = textureHeight;