Sleeping Wombat Graphic API  1.010
swGraphicAPI
MeshResources.h
Go to the documentation of this file.
1 #pragma once
2 
11 #include "swCommonLib/Common/ObjectDeleter.h"
12 #include "swCommonLib/System/Path.h"
13 
18 #include "swGraphicAPI/Resources/IShaderInputLayout.h"
20 #include "swGraphicAPI/Resources/ResourcePtr.h"
21 #include "swGraphicAPI/Resources/BufferInitData.h"
22 
23 #include <DirectXMath.h>
24 
25 
26 //definicje
29 #define WRONG_ID 0
30 
47 class AssetsManager;
48 struct ModelPart;
49 class BufferObject;
50 class TextureObject;
51 class VertexShader;
52 class PixelShader;
53 struct MeshPartObject;
54 struct MaterialObject;
55 
56 /*
57 // W buforze wierzchołków znajdują się elementy typu VERT_INDEX.
58 // Definicja typu VERT_INDEX znajduje się w pliku macros_switches.h i wygląda tak:
59 
60 #if defined(INDEX_BUFFER_UINT16)
61 typedef UINT16 VERT_INDEX;
62 #elif defined(INDEX_BUFFER_UINT32)
63 typedef UINT32 VERT_INDEX;
64 #else
65 typedef UINT32 VERT_INDEX;
66 #endif
67 
68 */
69 
70 
71 static const std::wstring RENDER_TARGET_COLOR_BUFFER_NAME = L"::color";
72 static const std::wstring RENDER_TARGET_DEPTH_BUFFER_NAME = L"::depth";
73 static const std::wstring RENDER_TARGET_STENCIL_BUFFER_NAME = L"::stencil";
74 
75 
76 typedef uint16 Index16;
77 typedef uint32 Index32;
78 typedef uint8 Index8;
79 
80 
88 {
97 };
98 
99 
100 
101 
102 //----------------------------------------------------------------------------------------------//
103 // TextureObject //
104 //----------------------------------------------------------------------------------------------//
105 
118 enum class MipMapFilter : short
119 {
120  Box = 0,
121  Tent,
122  Bell,
123  bSpline,
124  Mitchell,
125  Lanczos3,
126  Blackman,
127  Lanczos4,
128  Lanczos6,
129  Lanczos12,
130  Kaiser,
131  Gaussian,
132  Catmullrom,
133  QuadraticInterpolation,
134  QuadraticAproximation,
135  QuadraticMix,
136 
137  Unknown
138 };
139 
140 
146 {
147  uint16 TextureWidth;
148  uint16 TextureHeight;
149  uint16 ArraySize;
150  bool CPURead : 1;
151  bool CPUWrite : 1;
153  bool IsCubeMap : 1;
154  bool GenerateMipMaps : 1;
159  uint16 MipMapLevels;
160  uint16 CutOffMipMaps;
161 
163  uint32 MemorySize;
164  filesystem::Path FilePath;
165 
166  TextureInfo()
167  {
168  ArraySize = 1;
169  CPURead = false;
170  CPUWrite = false;
171  AllowShareResource = false;
172  IsCubeMap = false;
173  GenerateMipMaps = false;
175  MipMapFilter = MipMapFilter::Unknown;
176  MipMapLevels = 1;
177  CutOffMipMaps = 0;
178  TextureType = TextureType::TEXTURE_TYPE_TEXTURE2D;
179  MemorySize = 0;
180  }
181 
182 private:
183  RTTR_REGISTRATION_FRIEND;
184 
185  int GetWidth () { return TextureWidth; }
186  int GetHeight () { return TextureHeight; }
187  int GetArraySize () { return ArraySize; }
188  bool IsCPUReadable () { return CPURead; }
189  bool IsCPUWriteable () { return CPUWrite; }
190  bool IsSharedResource() { return AllowShareResource; }
191  bool IsCubeMapTex () { return IsCubeMap; }
192  bool GenMipMaps () { return GenerateMipMaps; }
193  int GetMipLevels () { return MipMapLevels; }
194 
195  std::string GetPath () { return FilePath.String(); }
196 };
197 
207 {
208  RTTR_ENABLE( ResourceObject );
209  friend ObjectDeleter<TextureObject>;
210 private:
211 protected:
213  virtual ~TextureObject() = default;
214 public:
215  TextureObject() : ResourceObject( 0 ) {}
216 
217  virtual const filesystem::Path& GetFilePath () const = 0;
218 
219  virtual MemoryChunk CopyData () const = 0;
220  virtual const TextureInfo& GetDescriptor () const = 0;
221 
222  virtual std::string GetResourceName () const override { return GetFilePath().String(); }
223 
224  inline bool operator==( TextureObject& object );
225  inline bool operator==( const std::wstring& file_name );
226 };
227 
228 //----------------------------------------------------------------------------------------------//
229 // RenderTargetObject //
230 //----------------------------------------------------------------------------------------------//
231 
239 {
240  uint16 TextureWidth;
241  uint16 TextureHeight;
242  uint16 ArraySize;
243  bool CPURead : 1;
244  bool CPUWrite : 1;
246  bool IsCubeMap : 1;
247  uint8 NumSamples;
248  uint16 SamplesQuality;
249  TextureType TextureType;
253 
263  {
264  ArraySize = 1;
265  CPURead = 0;
266  CPUWrite = 0;
267  AllowShareResource = 0;
268  IsCubeMap = 0;
270  }
271 
276  {
277  TextureInfo texInfo;
278  texInfo.TextureWidth = TextureWidth;
279  texInfo.TextureHeight = TextureHeight;
280  texInfo.ArraySize = ArraySize;
281  texInfo.CPURead = CPURead;
282  texInfo.CPUWrite = CPUWrite;
284  texInfo.IsCubeMap = IsCubeMap;
285  texInfo.TextureType = TextureType;
286  texInfo.Usage = Usage;
287 
288  return texInfo;
289  }
290 };
291 
302 {
303  RTTR_ENABLE( IRenderTarget );
304  RTTR_REGISTRATION_FRIEND;
305 private:
306 protected:
310 public:
311  RenderTargetObject( TextureObject* colorBuffer, TextureObject* depthBuffer, TextureObject* stencilBuffer );
312  virtual ~RenderTargetObject();
313 
314  inline TextureObject* GetColorBuffer() { return m_colorBuffer.Ptr(); }
315  inline TextureObject* GetDepthBuffer() { return m_depthBuffer.Ptr(); }
316  inline TextureObject* GetStencilBuffer() { return m_stencilBuffer.Ptr(); }
317 
318  virtual std::string GetResourceName () const override;
319 };
320 
321 //----------------------------------------------------------------------------------------------//
322 // ShaderInputLayout //
323 //----------------------------------------------------------------------------------------------//
324 
335 {
336  RTTR_ENABLE( IShaderInputLayout );
337  friend ObjectDeleter< ShaderInputLayout >;
338 private:
339 protected:
340  virtual ~ShaderInputLayout() = default;
341 public:
342  ShaderInputLayout() = default;
343 
344  virtual std::string GetResourceName () const override { return ""; }
345 };
346 
353 {
354 private:
355  std::wstring m_inputLayoutName;
356 protected:
357 public:
358  InputLayoutDescriptor( const std::wstring& layoutName ) : m_inputLayoutName( layoutName ){}
359  virtual ~InputLayoutDescriptor() = default;
360 
361  virtual void AddRow ( const char* semanticName, ResourceFormat format, unsigned int inputSlot, unsigned int byteOffset, bool perInstance, unsigned int instanceDataStep ) = 0;
362 
363  std::wstring& GetName () { return m_inputLayoutName; }
364 };
365 
366 
369 enum class ShaderType : uint8
370 {
371  VertexShader = 0x01,
372  PixelShader = 0x02,
373  GeometryShader = 0x04,
374  TesselationControlShader = 0x08,
375  TesselationEvaluationShader = 0x10,
376  ComputeShader = 0x20
377 };
378 
379 //----------------------------------------------------------------------------------------------//
380 // VertexShader //
381 //----------------------------------------------------------------------------------------------//
382 
387 class VertexShader : public IShader
388 {
389  RTTR_ENABLE( IShader );
390  friend ObjectDeleter< VertexShader >;
391 private:
392 protected:
393  ~VertexShader() = default;
394 public:
395  VertexShader() = default;
396 
397  virtual std::string GetResourceName () const override { return ""; }
398 };
399 
400 //----------------------------------------------------------------------------------------------//
401 // PixelShader //
402 //----------------------------------------------------------------------------------------------//
403 
408 class PixelShader : public IShader
409 {
410  RTTR_ENABLE( IShader );
411  friend ObjectDeleter< PixelShader >;
412 private:
413 protected:
414  ~PixelShader() = default;
415 public:
416  PixelShader() = default;
417 
418  virtual std::string GetResourceName () const override { return ""; }
419 };
420 
421 //----------------------------------------------------------------------------------------------//
422 // GeometryShader //
423 //----------------------------------------------------------------------------------------------//
424 
429 class GeometryShader : public IShader
430 {
431  RTTR_ENABLE( IShader );
432  friend ObjectDeleter<GeometryShader>;
433 private:
434 protected:
435  ~GeometryShader() = default;
436 public:
437  GeometryShader() = default;
438 
439  virtual std::string GetResourceName () const override { return ""; }
440 };
441 
442 //----------------------------------------------------------------------------------------------//
443 // ControlShader //
444 //----------------------------------------------------------------------------------------------//
445 
450 class ControlShader : public IShader
451 {
452  RTTR_ENABLE( IShader );
453  friend ObjectDeleter< ControlShader >;
454 private:
455 protected:
456  ~ControlShader() = default;
457 public:
458  ControlShader() = default;
459 
460  virtual std::string GetResourceName () const override { return ""; }
461 };
462 
463 //----------------------------------------------------------------------------------------------//
464 // EvaluationShader //
465 //----------------------------------------------------------------------------------------------//
466 
471 class EvaluationShader : public IShader
472 {
473  RTTR_ENABLE( IShader );
474  friend ObjectDeleter< EvaluationShader >;
475 private:
476 protected:
477  ~EvaluationShader() = default;
478 public:
479  EvaluationShader() = default;
480 
481  virtual std::string GetResourceName () const override { return ""; }
482 };
483 
484 //----------------------------------------------------------------------------------------------//
485 // ComputeShader //
486 //----------------------------------------------------------------------------------------------//
487 
492 class ComputeShader : public IShader
493 {
494  RTTR_ENABLE( IShader );
495  friend ObjectDeleter<ComputeShader>;
496 private:
497 protected:
498  ~ComputeShader() = default;
499 public:
500  ComputeShader() = default;
501 
502  virtual std::string GetResourceName () const override { return ""; }
503 };
504 
505 //----------------------------------------------------------------------------------------------//
506 // BufferObject //
507 //----------------------------------------------------------------------------------------------//
508 
516 class BufferObject : public IBuffer
517 {
518  RTTR_ENABLE( IBuffer )
519  friend ObjectDeleter<BufferObject>;
520 protected:
521  unsigned int m_elementSize;
522  unsigned int m_elementCount;
523 
524  ~BufferObject() = default;
525 public:
526  BufferObject( unsigned int elementSize, unsigned int elementCount );
527 
528  inline unsigned int GetStride() { return m_elementSize; }
529  inline unsigned int GetElementSize() { return m_elementSize; }
530  inline unsigned int GetElementCount() { return m_elementCount; }
531 
532  virtual std::string GetResourceName () const override { return GetDescriptor().GetName(); }
533 };
534 
535 //----------------------------------------------------------------------------------------------//
536 // MaterialObject //
537 //----------------------------------------------------------------------------------------------//
538 
539 
561 {
562  RTTR_ENABLE( ResourceObject );
563 public:
564  friend ObjectDeleter<MaterialObject>;
565 
566  DirectX::XMFLOAT4 Diffuse; //Składowa przezroczystości odnosi się do całego materiału
567  DirectX::XMFLOAT4 Ambient;
568  DirectX::XMFLOAT4 Specular;
569  DirectX::XMFLOAT4 Emissive;
570  float Power;
571 
572  MaterialObject( unsigned int id = WRONG_ID ) : ResourceObject( id ){}
573  MaterialObject( const MaterialObject* material );
574 
575  void SetNullMaterial();
576 
577  virtual std::string GetResourceName () const override { return ""; }
578 };
579 
580 
virtual std::string GetResourceName() const override
Zwraca nazwę zasobu. To może być nazwa pliku, na podstawie którego stworzono zasób, ale zasadniczo interpretacja jest dowolna.
Definition: MeshResources.h:481
unsigned int GetStride()
Zwraca rozmiar pojedynczego elementu w buforze.
Definition: MeshResources.h:528
bool AllowShareResource
Pozwala na dostęp do zasoby z wielu API graficznych i pomiędzy kontekstami.
Definition: MeshResources.h:152
Klasa przechowująca pixel shader.
Definition: MeshResources.h:429
DepthStencilFormat
Typy dostępne dla bufora głębokości.
Definition: GraphicAPIConstants.h:141
bool AllowShareResource
Pozwala na dostęp do zasoby z wielu API graficznych i pomiędzy kontekstami.
Definition: MeshResources.h:245
ResourceFormat Format
Format tekstury (liczba kanałów, liczba bitów na kanał itp)
Definition: MeshResources.h:157
Deskryptor tekstury.
Definition: MeshResources.h:145
virtual const filesystem::Path & GetFilePath() const =0
Zwraca nazwę pliku, który posłużył do stworzenia obiektu.
Base class for buffers.
Definition: IBuffer.h:71
Bump mapa.
Definition: MeshResources.h:92
unsigned int GetElementSize()
Zwraca rozmiar pojedynczego elementu w buforze.
Definition: MeshResources.h:529
Obiekt opakowujący bufor.Bufor może być zarówno buforem wierzchołków, indeksów jak i stałych...
Definition: MeshResources.h:516
ResourcePtr< TextureObject > m_depthBuffer
Pozwala na dostęp do bufora głębokości. Może być nullptrem.
Definition: MeshResources.h:308
Klasa przechowuje opis layoutu wierzchołka, na podstawie którego tworzony jest obiekt layoutu...
Definition: MeshResources.h:352
ResourceFormat
Specyfikuje format tekstury bądź innego zasobu.
Definition: GraphicAPIConstants.h:153
ResourceObject(int id)
Definition: ResourceObject.h:44
TextureObject * GetColorBuffer()
Zwraca obiekt bufora kolorów.
Definition: MeshResources.h:314
TextureType TextureType
Typ tekstury (liczba wymiarów, multsampling). Tekstura nie może być inna niż dwuwymiarowa (może być t...
Definition: MeshResources.h:249
bool operator==(TextureObject &object)
Porównuje ze soba dwa obiekty tekstur.
Definition: MeshResources.cpp:398
TextureType
Definiuje typ tekstury.
Definition: GraphicAPIConstants.h:123
Tekstura dla kanału diffuse.
Definition: MeshResources.h:89
uint32 MemorySize
Pamięć zajmowana przez teksturę.
Definition: MeshResources.h:163
Tekstura dla kanału specular.
Definition: MeshResources.h:90
unsigned int m_elementCount
Liczba elementów.
Definition: MeshResources.h:522
DepthStencilFormat DepthStencilFormat
Format bufora głębokości i stencilu.
Definition: MeshResources.h:251
ResourcePtr< TextureObject > m_colorBuffer
Pozwala na dostęp do bufora kolorów dla innych obiektów. Może być nullptrem.
Definition: MeshResources.h:307
virtual std::string GetResourceName() const override
Zwraca nazwę zasobu. To może być nazwa pliku, na podstawie którego stworzono zasób, ale zasadniczo interpretacja jest dowolna.
Definition: MeshResources.h:460
virtual const BufferInfo & GetDescriptor() const =0
Returns buffer descriptor.
uint16 TextureHeight
Wysokość tekstury w pikselach.
Definition: MeshResources.h:148
Pozawala GPU na zapis i odczyt.
bool IsCubeMap
Należy ustawić jeżeli tekstura jest cubemapą.
Definition: MeshResources.h:246
#define WRONG_ID
Definition: MeshResources.h:29
Klasa przechowująca pixel shader.
Definition: MeshResources.h:450
virtual std::string GetResourceName() const override
Zwraca nazwę zasobu. To może być nazwa pliku, na podstawie którego stworzono zasób, ale zasadniczo interpretacja jest dowolna.
Definition: MeshResources.h:502
filesystem::Path FilePath
Ścieżka do pliku z teksturą lub jej nazwa.
Definition: MeshResources.h:164
TextureType TextureType
Typ tekstury (liczba wymiarów, multsampling). Na razie tekstura nie może być inna niż dwuwymiarowa (m...
Definition: MeshResources.h:155
virtual std::string GetResourceName() const override
Zwraca nazwę zasobu. To może być nazwa pliku, na podstawie którego stworzono zasób, ale zasadniczo interpretacja jest dowolna.
Definition: MeshResources.h:344
ResourceUsage Usage
Sposób użycia render targetu. Wpływa na optymalizacje ułożenia w pamięci.
Definition: MeshResources.h:156
TextureUse
Meaning of texture indicies.
Definition: MeshResources.h:87
TextureObject * GetStencilBuffer()
Zwraca obiekt bufora stencilu.
Definition: MeshResources.h:316
virtual std::string GetResourceName() const override
Zwraca nazwę zasobu. To może być nazwa pliku, na podstawie którego stworzono zasób, ale zasadniczo interpretacja jest dowolna.
Definition: MeshResources.h:577
uint16 ArraySize
Liczba elementów tablicy.
Definition: MeshResources.h:149
virtual std::string GetResourceName() const override
Zwraca nazwę zasobu. To może być nazwa pliku, na podstawie którego stworzono zasób, ale zasadniczo interpretacja jest dowolna.
Definition: MeshResources.h:439
Klasa przechowująca pixel shader.
Definition: MeshResources.h:408
uint8 NumSamples
Liczba próbek w przypadku stosowania multisamplingu.
Definition: MeshResources.h:247
Tekstura o dowolnym znaczeniu.
Definition: MeshResources.h:94
MipMapFilter MipMapFilter
Tryb filtrowania tekstury. Używany tylko jeżeli ustawiono GenerateMipMaps na true.
Definition: MeshResources.h:158
Struktura używana do tworzenia render targetu.
Definition: MeshResources.h:238
TextureInfo CreateTextureInfo() const
Tworzy strukture TextureInfo wypełnioną danymi zgodnymi z deskryptorem RenderTargetu.
Definition: MeshResources.h:275
uint16 CutOffMipMaps
Definition: MeshResources.h:160
Definition: IRenderTarget.h:10
ResourceFormat ColorBuffFormat
Format bufora kolorów.
Definition: MeshResources.h:250
Klasa przechowująca pixel shader.
Definition: MeshResources.h:471
ResourceUsage
Specyfikuje typ dostępu do pamięci danego zasobu.
Definition: GraphicAPIConstants.h:72
Texture for emmisive channel.
Definition: MeshResources.h:91
Klasa przechowująca tekstury.Klasa bazowa, która będzie używana przez obiekty silnika. Powinny po niej odziedziczyć obiekty konkretnego API graficznego, żeby zaimplementować najważniejsze funkcjonalności.
Definition: MeshResources.h:206
TextureObject * GetDepthBuffer()
Zwraca obiekt bufora głębokości.
Definition: MeshResources.h:315
bool CPURead
Pozwala na odczyt tekstury przez CPU.
Definition: MeshResources.h:243
virtual std::string GetResourceName() const override
Zwraca nazwę zasobu. To może być nazwa pliku, na podstawie którego stworzono zasób, ale zasadniczo interpretacja jest dowolna.
Definition: MeshResources.h:532
Klasa przechowująca compute shader.
Definition: MeshResources.h:492
ResourceUsage Usage
Sposób użycia render targetu. Wpływa na optymalizacje ułożenia w pamięci.
Definition: MeshResources.h:252
uint16 TextureWidth
Szerokość tekstury w pikselach.
Definition: MeshResources.h:147
uint16 SamplesQuality
Jakość próbek przy multisamplingu.
Definition: MeshResources.h:248
bool CPUWrite
Pozwala na zapis tekstury przez CPU.
Definition: MeshResources.h:244
Tekstura przemieszczeń wierzchołków, w przypadku używania teselacji wierzchołków. ...
Definition: MeshResources.h:93
MipMapFilter
Tryby filtrowania tekstur.
Definition: MeshResources.h:118
uint16 TextureHeight
Wysokość tekstury w pikselach.
Definition: MeshResources.h:241
virtual ~RenderTargetObject()
Destruktor kasuje obiekty tekstury głębokości i bufora koloru, jeżeli nie są używane. Jeżeli istnieją odwołania do tych obiektów, to nie są one kasowane, a jedynie usuwa się odwołania pochodzące od RenderTargetObject.
Definition: MeshResources.cpp:441
Struktura przechowująca materiał.
Definition: MeshResources.h:560
bool CPUWrite
Pozwala na zapis tekstury przez CPU.
Definition: MeshResources.h:151
void SetNullMaterial()
Ustawia materiał na wartości domyślne dla silnika.
Definition: MeshResources.cpp:499
Definition: IShaderInputLayout.h:13
uint16 ArraySize
Liczba elementów tablicy.
Definition: MeshResources.h:242
ShaderType
Typ shadera.
Definition: MeshResources.h:369
Tekstura o dowolnym znaczeniu.
Definition: MeshResources.h:95
Klasa przechowuje layout wierzchołka trafiającego do vertex shadera.
Definition: MeshResources.h:334
Klasa dla render targetów.Klasa umożliwia pobranie jednej z tekstur składowych i udostępnienie dla sh...
Definition: MeshResources.h:301
uint16 MipMapLevels
Liczba poziomów mipmap. 1 oznacza tylko teksturę oryginalną.
Definition: MeshResources.h:159
uint16 TextureWidth
Szerokość tekstury w pikselach.
Definition: MeshResources.h:240
unsigned int GetElementCount()
Zwraca liczbę elementów w buforze.
Definition: MeshResources.h:530
unsigned int m_elementSize
Rozmiar elementu.
Definition: MeshResources.h:521
virtual std::string GetResourceName() const override
Zwraca nazwę zasobu. To może być nazwa pliku, na podstawie którego stworzono zasób, ale zasadniczo interpretacja jest dowolna.
Definition: MeshResources.h:222
virtual std::string GetResourceName() const override
Zwraca nazwę zasobu. To może być nazwa pliku, na podstawie którego stworzono zasób, ale zasadniczo interpretacja jest dowolna.
Definition: MeshResources.h:418
Klasa przechowująca vertex shader.
Definition: MeshResources.h:387
Plik zawiera deklarację i definicję klasy ResourceObject służącą do zliczania odwołań do obiektu...
RenderTargetDescriptor()
Ustawia domyślne wartości deskryptora.
Definition: MeshResources.h:262
Klasa ułatwiająca zarządzanie odwołaniami do assetów.Obiekty assetów (np. MaterialObject, TextureObject, VertexShader, PixelShader itp.) wymagają jakiegoś systemu zapewniającego współdzielenie między innymi obiektami.
Definition: ResourceObject.h:30
virtual ~TextureObject()=default
Żeby uniknąć pomyłki, obiekt może byś kasowany tylko przez AssetsManager. Zapewnia to ObjectDeleter...
virtual std::string GetResourceName() const override
Definition: MeshResources.cpp:463
Definition: IShader.h:15
virtual const TextureInfo & GetDescriptor() const =0
Pozwala pobrać deskrytpro tekstury.
bool CPURead
Pozwala na odczyt tekstury przez CPU.
Definition: MeshResources.h:150
ResourcePtr< TextureObject > m_stencilBuffer
Pozwala na dostęp do bufora stencil. Może być nulltrem.
Definition: MeshResources.h:309
virtual MemoryChunk CopyData() const =0
Kopiuje dane z bufora i umieszcza je w zwracanym MemoryChunku.
bool IsCubeMap
Należy ustawić jeżeli tekstura jest cubemapą.
Definition: MeshResources.h:153
Lightmapa.
Definition: MeshResources.h:96
virtual std::string GetResourceName() const override
Zwraca nazwę zasobu. To może być nazwa pliku, na podstawie którego stworzono zasób, ale zasadniczo interpretacja jest dowolna.
Definition: MeshResources.h:397
bool GenerateMipMaps
Automatyczne generowanie mipmap.
Definition: MeshResources.h:154