Aether3D Game Engine
TextureBase.hpp
1 #ifndef TEXTURE_BASE_H
2 #define TEXTURE_BASE_H
3 
4 #if RENDERER_METAL
5 #import <Metal/Metal.h>
6 #endif
7 #if RENDERER_D3D12
8 #include <vector>
9 #include <d3d12.h>
10 #endif
11 #include "Vec3.hpp"
12 
13 #if RENDERER_D3D12
14 // TODO: Move inside engine
15 struct GpuResource
16 {
17  ID3D12Resource* resource = nullptr;
18  D3D12_RESOURCE_STATES usageState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
19  D3D12_RESOURCE_STATES transitioningState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
20  D3D12_GPU_VIRTUAL_ADDRESS gpuVirtualAddress = 0;
21 };
22 #endif
23 
24 namespace ae3d
25 {
27  enum class TextureWrap
28  {
29  Repeat,
30  Clamp
31  };
32 
34  enum class TextureFilter
35  {
36  Nearest,
37  Linear
38  };
39 
41  enum class Mipmaps
42  {
43  Generate,
44  None
45  };
46 
47  enum class ColorSpace
48  {
49  RGB,
50  SRGB
51  };
52 
55  {
56  public:
58  unsigned GetID() const { return handle; }
59 #if RENDERER_METAL
60  id<MTLTexture> GetMetalTexture() const { return metalTexture; }
61 #endif
62 #if RENDERER_D3D12
63  GpuResource* GetGpuResource() { return &gpuResource; }
64  D3D12_CPU_DESCRIPTOR_HANDLE& GetDSV() { return dsv; }
65  D3D12_CPU_DESCRIPTOR_HANDLE& GetRTV() { return rtv; }
66 
67  D3D12_CPU_DESCRIPTOR_HANDLE& GetCubeDSV( unsigned cubeMapFace ) { return cubeDsvs[ cubeMapFace ]; }
68  D3D12_CPU_DESCRIPTOR_HANDLE& GetCubeRTV( unsigned cubeMapFace ) { return cubeRtvs[ cubeMapFace ]; }
69 #endif
70  ColorSpace GetColorSpace() const { return colorSpace; }
72 
74  float GetAnisotropy() const { return anisotropy; }
75 
77  int GetWidth() const { return width; }
78 
80  int GetHeight() const { return height; }
81 
83  TextureWrap GetWrap() const { return wrap; }
84 
86  TextureFilter GetFilter() const { return filter; }
87 
89  Mipmaps GetMipmaps() const { return mipmaps; }
90 
92  const Vec4& GetScaleOffset() const { return scaleOffset; }
93 
95  bool IsOpaque() const { return opaque; }
96 
98  bool IsRenderTexture() const { return isRenderTexture; }
99 
100  protected:
102  int width = 0;
104  int height = 0;
106  unsigned handle = 0;
108  TextureWrap wrap = TextureWrap::Repeat;
110  TextureFilter filter = TextureFilter::Nearest;
112  Vec4 scaleOffset{ 1, 1, 0, 0 };
114  Mipmaps mipmaps = Mipmaps::None;
116  float anisotropy = 1;
118  ColorSpace colorSpace = ColorSpace::RGB;
119 #if RENDERER_METAL
120  id<MTLTexture> metalTexture;
121 #endif
122 #if RENDERER_D3D12
123  GpuResource gpuResource;
124  GpuResource gpuResourceDepth;
125 
126  D3D12_CPU_DESCRIPTOR_HANDLE srv = {};
127  D3D12_CPU_DESCRIPTOR_HANDLE rtv = {};
128  D3D12_CPU_DESCRIPTOR_HANDLE dsv = {};
129 
130  D3D12_CPU_DESCRIPTOR_HANDLE cubeRtvs[ 6 ] = {};
131  D3D12_CPU_DESCRIPTOR_HANDLE cubeDsvs[ 6 ] = {};
132 #endif
133  bool opaque = true;
136  bool isRenderTexture = false;
137  };
138 }
139 
140 #endif
const Vec4 & GetScaleOffset() const
Definition: TextureBase.hpp:92
unsigned GetID() const
Definition: TextureBase.hpp:58
Definition: AudioClip.hpp:4
4-component vector.
Definition: Vec3.hpp:351
bool IsRenderTexture() const
Definition: TextureBase.hpp:98
TextureWrap GetWrap() const
Definition: TextureBase.hpp:83
int GetHeight() const
Definition: TextureBase.hpp:80
bool IsOpaque() const
Definition: TextureBase.hpp:95
float GetAnisotropy() const
Definition: TextureBase.hpp:74
Mipmaps GetMipmaps() const
Definition: TextureBase.hpp:89
int GetWidth() const
Definition: TextureBase.hpp:77
TextureFilter GetFilter() const
Definition: TextureBase.hpp:86
Base class for textures.
Definition: TextureBase.hpp:54