// Copyright (c) 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. /// class FLAXENGINE_API TextureMipData { public: uint32 RowPitch; uint32 DepthPitch; uint32 Lines; 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; void Copy(void* data, uint32 dataRowPitch, uint32 dataDepthPitch, uint32 dataDepthSlices, uint32 targetRowPitch); 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)); } }; /// /// Texture data container (used to keep data downloaded from the GPU). /// API_CLASS() class FLAXENGINE_API TextureData : public ScriptingObject { DECLARE_SCRIPTING_TYPE_WITH_CONSTRUCTOR_IMPL(TextureData, ScriptingObject); public: /// /// Single entry of the texture array. Contains collection of mip maps. /// struct FLAXENGINE_API ArrayEntry { /// /// The mip maps collection. /// Array> Mips; }; public: /// /// Top level texture surface width (in pixels). /// API_FIELD(ReadOnly) int32 Width = 0; /// /// Top level texture surface height (in pixels). /// API_FIELD(ReadOnly) int32 Height = 0; /// /// Top level texture surface depth (in pixels). /// API_FIELD(ReadOnly) int32 Depth = 0; /// /// The texture data format. /// API_FIELD(ReadOnly) PixelFormat Format = PixelFormat::Unknown; /// /// The items collection (depth slices or array slices). /// 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 texture slices in the array. /// API_PROPERTY() int32 GetArraySize() const; /// /// Gets amount of mip maps in the texture. /// API_PROPERTY() int32 GetMipLevels() const; /// /// Clear allocated memory. /// API_FUNCTION() void Clear(); public: /// /// Gets the texture pixels as Color32 array. /// /// Supported only for 'basic' texture formats (uncompressed, single plane). /// The result texture pixels array. /// The mip index (zero-based). /// The array or depth slice index (zero-based). /// True if failed, otherwise false. API_FUNCTION() bool GetPixels(API_PARAM(Out) Array& pixels, int32 mipIndex = 0, int32 arrayIndex = 0); /// /// Gets the texture pixels as Color array. /// /// Supported only for 'basic' texture formats (uncompressed, single plane). /// The result texture pixels array. /// The mip index (zero-based). /// The array or depth slice index (zero-based). /// True if failed, otherwise false. API_FUNCTION() bool GetPixels(API_PARAM(Out) Array& pixels, int32 mipIndex = 0, int32 arrayIndex = 0); };