// 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 }; };