NAP
samplerinstance.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4 
5 #pragma once
6 
7 // Local Includes
8 #include "sampler.h"
9 
10 namespace nap
11 {
12  // Called when the bound sampler resource changes
13  using SamplerChangedCallback = std::function<void(SamplerInstance&, int)>;
14 
18  class NAPAPI SamplerInstance
19  {
20  RTTI_ENABLE()
21  public:
29  SamplerInstance(RenderService& renderService, const SamplerDeclaration& declaration, const Sampler* sampler, const SamplerChangedCallback& samplerChangedCallback);
30  virtual ~SamplerInstance();
31 
37  bool init(utility::ErrorState& errorState);
38 
42  const SamplerDeclaration& getDeclaration() const { assert(mDeclaration != nullptr); return *mDeclaration; }
43 
47  VkSampler getVulkanSampler() const { return mVulkanSampler; }
48 
49  protected:
54  void raiseChanged(int index = 0) { if (mSamplerChangedCallback) mSamplerChangedCallback(*this, index); }
55 
56  RenderService* mRenderService = nullptr;
57  VkSampler mVulkanSampler = VK_NULL_HANDLE;
58  const Sampler* mSampler = nullptr;
59  const SamplerDeclaration* mDeclaration = nullptr;
61  };
62 
63 
65  // SamplerArrayInstance
67 
71  class NAPAPI SamplerArrayInstance : public SamplerInstance
72  {
73  RTTI_ENABLE(SamplerInstance)
74  public:
75  SamplerArrayInstance(RenderService& renderService, const SamplerDeclaration& declaration, const Sampler* sampler, const SamplerChangedCallback& samplerChangedCallback);
76  virtual ~SamplerArrayInstance();
77 
81  virtual int getNumElements() const { return mDeclaration->mNumElements; }
82  };
83 
84 
86  // Sampler2DInstance
88 
93  class NAPAPI Sampler2DInstance : public SamplerInstance
94  {
95  RTTI_ENABLE(SamplerInstance)
96  public:
104  Sampler2DInstance(RenderService& renderService, const SamplerDeclaration& declaration, const Sampler2D* sampler2D, const SamplerChangedCallback& samplerChangedCallback);
105 
110  void setTexture(Texture2D& texture);
111 
115  bool hasTexture() const { return mTexture2D != nullptr; }
116 
120  const Texture2D& getTexture() const { return *mTexture2D; }
121 
122  private:
127  void onTextureDestroyed();
128  nap::Slot<> textureDestroyedSlot = { [&]() -> void { onTextureDestroyed(); } };
129 
130  rtti::ObjectPtr<Texture2D> mTexture2D;
131  };
132 
133 
135  // Sampler2DArrayInstance
137 
143  {
144  RTTI_ENABLE(SamplerArrayInstance)
145  public:
153  Sampler2DArrayInstance(RenderService& renderService, const SamplerDeclaration& declaration, const Sampler2DArray* sampler2DArray, const SamplerChangedCallback& samplerChangedCallback);
154 
158  bool hasTexture(int index) const { assert(index < mTextures.size()); return mTextures[index] != nullptr; }
159 
164  const Texture2D& getTexture(int index) const { assert(index < mTextures.size()); return *mTextures[index]; }
165 
171  void setTexture(int index, Texture2D& texture);
172 
178  rtti::ObjectPtr<Texture2D>& operator[](size_t index) { assert(index < mTextures.size()); return mTextures[index]; }
179 
180  private:
181  std::vector<rtti::ObjectPtr<Texture2D>> mTextures;
182  };
183 
184 
186  // SamplerCubeInstance
188 
193  class NAPAPI SamplerCubeInstance : public SamplerInstance
194  {
195  RTTI_ENABLE(SamplerInstance)
196  public:
204  SamplerCubeInstance(RenderService& renderService, const SamplerDeclaration& declaration, const SamplerCube* samplerCube, const SamplerChangedCallback& samplerChangedCallback);
205 
210  void setTexture(TextureCube& textureCube);
211 
215  bool hasTexture() const { return mTextureCube != nullptr; }
216 
220  const TextureCube& getTexture() const { (mTextureCube != nullptr); return *mTextureCube; }
221 
222  private:
227  void onTextureDestroyed();
228  nap::Slot<> textureDestroyedSlot = { [&]() -> void { onTextureDestroyed(); } };
229 
230  rtti::ObjectPtr<TextureCube> mTextureCube;
231  };
232 
233 
235  // SamplerCubeArrayInstance
237 
243  {
244  RTTI_ENABLE(SamplerArrayInstance)
245  public:
253  SamplerCubeArrayInstance(RenderService& renderService, const SamplerDeclaration& declaration, const SamplerCubeArray* samplerCubeArray, const SamplerChangedCallback& samplerChangedCallback);
254 
258  bool hasTexture(int index) const { assert(index < mTextures.size()); return mTextures[index] != nullptr; }
259 
264  const TextureCube& getTexture(int index) const { assert(index < mTextures.size()); return *mTextures[index]; }
265 
271  void setTexture(int index, TextureCube& textureCube);
272 
278  rtti::ObjectPtr<TextureCube>& operator[](size_t index) { assert(index < mTextures.size()); return mTextures[index]; }
279 
280  private:
281  std::vector<rtti::ObjectPtr<TextureCube>> mTextures;
282  };
283 }
nap::SamplerCubeArray
Definition: sampler.h:216
nap::SamplerInstance::getVulkanSampler
VkSampler getVulkanSampler() const
Definition: samplerinstance.h:47
nap::SamplerCubeArrayInstance
Definition: samplerinstance.h:242
nap::Sampler2DArrayInstance::operator[]
rtti::ObjectPtr< Texture2D > & operator[](size_t index)
Definition: samplerinstance.h:178
nap::Sampler2DInstance::getTexture
const Texture2D & getTexture() const
Definition: samplerinstance.h:120
nap::TextureCube
Definition: texture.h:298
nap::SamplerInstance::mSamplerChangedCallback
SamplerChangedCallback mSamplerChangedCallback
Definition: samplerinstance.h:60
nap::Slot
Slot.
Definition: signalslot.h:21
nap::SamplerArrayInstance::getNumElements
virtual int getNumElements() const
Definition: samplerinstance.h:81
nap::SamplerInstance::raiseChanged
void raiseChanged(int index=0)
Definition: samplerinstance.h:54
nap::Sampler2D
Definition: sampler.h:121
nap::rtti::ObjectPtr
Definition: objectptr.h:154
nap::Sampler2DArrayInstance::getTexture
const Texture2D & getTexture(int index) const
Definition: samplerinstance.h:164
nap::SamplerInstance::getDeclaration
const SamplerDeclaration & getDeclaration() const
Definition: samplerinstance.h:42
nap::Sampler2DInstance::hasTexture
bool hasTexture() const
Definition: samplerinstance.h:115
nap::utility::ErrorState
Definition: errorstate.h:19
nap::Sampler
Definition: sampler.h:86
nap::Texture2D
Definition: texture.h:128
nap::RenderService
Definition: renderservice.h:275
nap::Sampler2DArray
Definition: sampler.h:185
nap::SamplerInstance
Definition: samplerinstance.h:18
nap::SamplerCubeArrayInstance::getTexture
const TextureCube & getTexture(int index) const
Definition: samplerinstance.h:264
nap::Sampler2DArrayInstance::hasTexture
bool hasTexture(int index) const
Definition: samplerinstance.h:158
nap::SamplerCubeInstance::getTexture
const TextureCube & getTexture() const
Definition: samplerinstance.h:220
nap::Sampler2DArrayInstance
Definition: samplerinstance.h:142
nap::SamplerCubeInstance::hasTexture
bool hasTexture() const
Definition: samplerinstance.h:215
nap::SamplerCubeArrayInstance::operator[]
rtti::ObjectPtr< TextureCube > & operator[](size_t index)
Definition: samplerinstance.h:278
nap::SamplerDeclaration
Definition: samplerdeclaration.h:16
nap
Definition: templateapp.h:17
nap::SamplerCubeInstance
Definition: samplerinstance.h:193
nap::SamplerArrayInstance
Definition: samplerinstance.h:71
nap::Sampler2DInstance
Definition: samplerinstance.h:93
nap::SamplerCubeArrayInstance::hasTexture
bool hasTexture(int index) const
Definition: samplerinstance.h:258
nap::SamplerChangedCallback
std::function< void(SamplerInstance &, int)> SamplerChangedCallback
Definition: samplerinstance.h:13
nap::SamplerCube
Definition: sampler.h:143