Foundation
Loading...
Searching...
No Matches
Texture.hpp
Go to the documentation of this file.
1#pragma once
2#include <Core/Container.hpp>
3#include <Math/Math.hpp>
5#include "Serialization.hpp"
6#include "TextureDDS.hpp"
7using namespace Foundation;
8using namespace RHI;
9using namespace Core;
10using namespace Math;
11
13{
14 uint32_t magic{DDS_MAGIC};
17
18 [[nodiscard]] bool IsValid() const { return magic == DDS_MAGIC && GetSize() != 0; }
19 [[nodiscard]] uint32_t GetWidth() const { return header.width; }
20 [[nodiscard]] uint32_t GetHeight() const { return header.height; }
21 [[nodiscard]] uint32_t GetDepth() const;
22 [[nodiscard]] RHITextureDimension GetDimension() const;
23 [[nodiscard]] RHITextureDimension GetViewDimension() const;
24 [[nodiscard]] uint32_t GetNumLayers() const
25 {
27 return 6;
29 return header10.arraySize;
30 return 1;
31 }
32 [[nodiscard]] uint32_t GetNumMips() const { return header.mipMapCount > 0 ? header.mipMapCount : 1; }
33 [[nodiscard]] RHIResourceFormat GetFormat() const;
34 [[nodiscard]] uint32_t GetBlockSize() const;
35 [[nodiscard]] uint32_t GetBpp() const;
36 [[nodiscard]] static uint64_t CalculateTextureImageSize(uint32_t width, uint32_t height, uint32_t depth,
37 uint32_t mipLevels, uint32_t blockSize,
38 uint32_t blockDim);
39 [[nodiscard]] uint32_t GetSize() const;
40 [[nodiscard]] size_t GetSubresourceSize(uint32_t layer, uint32_t mip) const;
41 [[nodiscard]] RHIExtent3D GetMipExtent(uint32_t mipLevel) const;
42 [[nodiscard]] RHITextureDesc GetDesc() const;
43};
44
46{
47 FUUID id{};
50
52 : subresources(alloc)
53 {
54 }
55
56 [[nodiscard]] uint32_t GetSubresourceCount() const { return GetNumLayers() * GetNumMips(); }
57
58 [[nodiscard]] uint32_t GetSubresourceIndex(uint32_t layer, uint32_t mip) const
59 {
60 CHECK_MSG(layer < GetNumLayers(), "Texture layer {} out of range {}", layer, GetNumLayers());
61 CHECK_MSG(mip < GetNumMips(), "Texture mip {} out of range {}", mip, GetNumMips());
62 return layer * GetNumMips() + mip;
63 }
64
65 [[nodiscard]] FBlobRef const& GetSubresourceBlob(uint32_t layer, uint32_t mip) const
66 {
67 uint32_t const index = GetSubresourceIndex(layer, mip);
68 CHECK_MSG(index < subresources.size(), "Texture subresource {} missing from serialized texture", index);
69 return subresources[index];
70 }
71
72 [[nodiscard]] bool IsValid() const
73 {
74 return FTextureHeader::IsValid() && subresources.size() == GetSubresourceCount() && !subresources.empty();
75 }
76};
77
79{
81
82 FTexture(Allocator* alloc);
83 void Initialize(RHIResourceFormat format, RHITextureDimension dimension, uint32_t width, uint32_t height = 1,
84 uint32_t depth = 1, uint32_t mipCount = 1, uint32_t layerCount = 1);
85 [[nodiscard]] bool IsValid() const { return FTextureHeader::IsValid() && bytes.size() == GetSize(); }
86 // Get raw subresource slice that can be uploaded to the GPU directly
87 [[nodiscard]] Span<unsigned char> GetSubresource(uint32_t mipLevel = 0, uint32_t arrayLayer = 0) const;
88
92 void GenerateMips();
97};
98
103void LoadDDS(FTexture& texture, StringView path);
109void LoadRGBA8(FTexture& texture, StringView path, bool gamma = true);
115void LoadRGBA8(FTexture& texture, Span<const unsigned char> data, bool gamma = true);
120void LoadHDR(FTexture& texture, StringView path);
121void LoadHDR(FTexture& texture, Span<const unsigned char> data);
130void SaveHDR(const float* data, int width, int height, StringView path);
138void SavePNG(const unsigned char* data, int width, int height, StringView path);
139
140float4 SampleF32Bilinear(Span<const float4> mip, uint32_t mipW, uint32_t mipH, float u, float v);
141float4 SampleF32Trilinear(const float4* const* mips, const uint32_t* mipW, const uint32_t* mipH, uint32_t mipCount,
142 float u, float v, float mip);
143float2 EquirectDirectionToUV(float3 dir);
144float3 EquirectUVToDirection(float2 uv);
145/* -- Serialization -- */
146template <>
147inline void FSerialize(FWriter& w, FSerializedTexture const& obj)
148{
149 FSerialize(w, obj.id);
150 FSerialize(w, obj.name);
151 FTextureHeader const& header = obj;
152 FSerialize(w, header.magic);
153 FSerialize(w, header.header);
154 FSerialize(w, header.header10);
155 FSerialize(w, obj.subresources);
156}
157
158template <>
160{
161 FDeserialize(r, obj.id);
162 FDeserialize(r, obj.name);
163 FTextureHeader& header = obj;
164 FDeserialize(r, header.magic);
165 FDeserialize(r, header.header);
166 FDeserialize(r, header.header10);
168}
169
170template <>
171inline void FSerialize(FWriter& w, FTexture const& obj)
172{
173 FSerialize(w, obj.magic);
174 FSerialize(w, obj.header);
176 FSerialize(w, obj.header10);
177 CHECK(w.write(obj.bytes.data(), obj.bytes.size()) == obj.bytes.size());
178}
179template <>
180inline void FDeserialize(FReader& r, FTexture& obj)
181{
182 FDeserialize(r, obj.magic);
183 CHECK(obj.magic == DDS_MAGIC);
184 FDeserialize(r, obj.header);
186 FDeserialize(r, obj.header10);
187 obj.bytes.resize(obj.GetSize());
188 CHECK(r.read(obj.bytes.data(), obj.bytes.size()) == obj.bytes.size());
189}
#define CHECK_MSG(expr, format_str,...)
#define GLOBAL_ALLOC
Definition Allocator.hpp:240
#define CHECK(expr)
Definition Logging.hpp:92
#define DDS_CUBEMAP
Definition TextureDDS.hpp:305
constexpr uint32_t DDS_MAGIC
Definition TextureDDS.hpp:135
constexpr DDS_PIXELFORMAT DDSPF_DX10
Definition TextureDDS.hpp:278
void FSerialize(FWriter &w, FSerializedTexture const &obj)
Definition Texture.hpp:147
float2 EquirectDirectionToUV(float3 dir)
void SaveHDR(const float *data, int width, int height, StringView path)
Definition Texture.cpp:475
float3 EquirectUVToDirection(float2 uv)
float4 SampleF32Bilinear(Span< const float4 > mip, uint32_t mipW, uint32_t mipH, float u, float v)
void LoadHDR(FTexture &texture, StringView path)
Definition Texture.cpp:447
void FDeserialize(FReader &r, FSerializedTexture &obj)
Definition Texture.hpp:159
void LoadDDS(FTexture &texture, StringView path)
Definition Texture.cpp:417
float4 SampleF32Trilinear(const float4 *const *mips, const uint32_t *mipW, const uint32_t *mipH, uint32_t mipCount, float u, float v, float mip)
void LoadRGBA8(FTexture &texture, StringView path, bool gamma=true)
Definition Texture.cpp:424
void SavePNG(const unsigned char *data, int width, int height, StringView path)
Definition Texture.cpp:489
Allocator interface (noexcept)
Definition Allocator.hpp:29
std::vector< T, StlAllocator< T > > Vector
std::vector with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:149
std::basic_string_view< char > StringView
Alias for std::basic_string_view<char>
Definition Container.hpp:56
std::span< T > Span
Alias for std::span
Definition Container.hpp:62
glm::vec< 3, uint32_t > RHIExtent3D
Definition Common.hpp:11
RHITextureDimension
Definition Common.hpp:276
RHIResourceFormat
Definition Common.hpp:34
Definition Allocator.hpp:6
Definition TextureDDS.hpp:355
uint32_t arraySize
Definition TextureDDS.hpp:359
Definition TextureDDS.hpp:337
uint32_t mipMapCount
Definition TextureDDS.hpp:344
DDS_PIXELFORMAT ddspf
Definition TextureDDS.hpp:346
uint32_t width
Definition TextureDDS.hpp:341
uint32_t height
Definition TextureDDS.hpp:340
uint32_t caps2
Definition TextureDDS.hpp:348
uint32_t fourCC
Definition TextureDDS.hpp:141
Definition Serialization.hpp:27
Definition Serialization.hpp:45
virtual size_t read(void *dest, size_t size)=0
Definition Texture.hpp:46
uint32_t GetSubresourceIndex(uint32_t layer, uint32_t mip) const
Definition Texture.hpp:58
FSerializedTexture(Allocator *alloc=GLOBAL_ALLOC)
Definition Texture.hpp:51
bool IsValid() const
Definition Texture.hpp:72
FUUID id
Definition Texture.hpp:47
Vector< FBlobRef > subresources
Definition Texture.hpp:49
FUUID name
Definition Texture.hpp:48
uint32_t GetSubresourceCount() const
Definition Texture.hpp:56
FBlobRef const & GetSubresourceBlob(uint32_t layer, uint32_t mip) const
Definition Texture.hpp:65
Definition Texture.hpp:13
uint32_t GetNumMips() const
Definition Texture.hpp:32
RHITextureDimension GetDimension() const
Definition Texture.cpp:28
RHIResourceFormat GetFormat() const
Definition Texture.cpp:64
uint32_t GetNumLayers() const
Definition Texture.hpp:24
uint32_t GetBpp() const
Definition Texture.cpp:189
DDS_HEADER_DXT10 header10
Definition Texture.hpp:16
uint32_t GetSize() const
Definition Texture.cpp:215
uint32_t magic
Definition Texture.hpp:14
RHITextureDesc GetDesc() const
Definition Texture.cpp:247
uint32_t GetBlockSize() const
Definition Texture.cpp:160
uint32_t GetWidth() const
Definition Texture.hpp:19
bool IsValid() const
Definition Texture.hpp:18
size_t GetSubresourceSize(uint32_t layer, uint32_t mip) const
Definition Texture.cpp:225
static uint64_t CalculateTextureImageSize(uint32_t width, uint32_t height, uint32_t depth, uint32_t mipLevels, uint32_t blockSize, uint32_t blockDim)
Definition Texture.cpp:145
RHITextureDimension GetViewDimension() const
Definition Texture.cpp:46
DDS_HEADER header
Definition Texture.hpp:15
uint32_t GetDepth() const
Definition Texture.cpp:60
RHIExtent3D GetMipExtent(uint32_t mipLevel) const
Definition Texture.cpp:239
uint32_t GetHeight() const
Definition Texture.hpp:20
Definition Texture.hpp:79
void GenerateMips()
Definition Texture.cpp:319
Vector< unsigned char > bytes
Definition Texture.hpp:80
bool IsValid() const
Definition Texture.hpp:85
Span< unsigned char > GetSubresource(uint32_t mipLevel=0, uint32_t arrayLayer=0) const
Definition Texture.cpp:261
void Initialize(RHIResourceFormat format, RHITextureDimension dimension, uint32_t width, uint32_t height=1, uint32_t depth=1, uint32_t mipCount=1, uint32_t layerCount=1)
Definition Texture.cpp:14
FTexture EncodeBC7(Allocator *alloc=GLOBAL_ALLOC) const
Definition Texture.cpp:496
Definition Serialization.hpp:37
virtual size_t write(const void *data, size_t size)=0
128-bit identifier. Two flavors, both well-formed per RFC 9562:
Definition UUID.hpp:35
Definition Resource.hpp:142