// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
#pragma once
#include "Engine/Core/Collections/Array.h"
#include "Engine/Core/Types/DataContainer.h"
#include "Engine/Graphics/Config.h"
#include "Engine/Graphics/PixelFormat.h"
///
/// Single texture mip map entry data.
///
API_STRUCT() struct FLAXENGINE_API TextureMipData
{
DECLARE_SCRIPTING_TYPE_MINIMAL(TextureMipData);
public:
// The row pitch.
API_FIELD() uint32 RowPitch;
// The depth pitch.
API_FIELD() uint32 DepthPitch;
// The number of lines.
API_FIELD() uint32 Lines;
// The data.
API_FIELD(ReadOnly) BytesContainer Data;
TextureMipData();
TextureMipData(const TextureMipData& other);
TextureMipData(TextureMipData&& other) noexcept;
TextureMipData& operator=(const TextureMipData& other);
TextureMipData& operator=(TextureMipData&& other) noexcept;
bool GetPixels(Array& pixels, int32 width, int32 height, PixelFormat format) const;
bool GetPixels(Array& pixels, int32 width, int32 height, PixelFormat format) const;
template
T& Get(int32 x, int32 y)
{
return *(T*)(Data.Get() + y * RowPitch + x * sizeof(T));
}
template
const T& Get(int32 x, int32 y) const
{
return *(const T*)(Data.Get() + y * RowPitch + x * sizeof(T));
}
};
template<>
struct TIsPODType
{
enum { Value = true };
};
///
/// Single entry of the texture array. Contains collection of mip maps.
///
API_STRUCT(NoDefault) struct FLAXENGINE_API TextureDataArrayEntry
{
DECLARE_SCRIPTING_TYPE_MINIMAL(TextureDataArrayEntry);
///
/// The mip maps collection.
///
API_FIELD(ReadOnly) Array> Mips;
};
template<>
struct TIsPODType
{
enum { Value = false };
};
///
/// Texture data container (used to keep data downloaded from the GPU).
///
API_STRUCT() struct FLAXENGINE_API TextureData
{
DECLARE_SCRIPTING_TYPE_MINIMAL(TextureData);
public:
public:
///
/// Init
///
TextureData()
{
}
///
/// Destructor
///
~TextureData()
{
}
public:
///
/// Top level texture width (in pixels).
///
API_FIELD() int32 Width = 0;
///
/// Top level texture height (in pixels).
///
API_FIELD() int32 Height = 0;
///
/// Top level texture depth (in pixels).
///
API_FIELD() int32 Depth = 0;
///
/// The texture data format.
///
API_FIELD() PixelFormat Format = PixelFormat::Unknown;
///
/// The items collection (depth slices or array slices).
///
API_FIELD() Array> Items;
public:
///
/// Gather texture data
///
/// Texture array index
/// Mip map index
/// Result data
TextureMipData* GetData(int32 arrayIndex, int32 mipLevel)
{
return &Items[arrayIndex].Mips[mipLevel];
}
///
/// Gather texture data
///
/// Texture array index
/// Mip map index
/// Result data
const TextureMipData* GetData(int32 arrayIndex, int32 mipLevel) const
{
return &Items[arrayIndex].Mips[mipLevel];
}
///
/// Gets amount of textures in the array
///
int32 GetArraySize() const
{
return Items.Count();
}
///
/// Gets amount of mip maps in the textures
///
int32 GetMipLevels() const
{
return Items.HasItems() ? Items[0].Mips.Count() : 0;
}
///
/// Clear data
///
void Clear()
{
Items.Resize(0, false);
}
};
template<>
struct TIsPODType
{
enum { Value = false };
};