NAP
materialinstance.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 // External includes
8 #include <nap/resourceptr.h>
9 #include <utility/dllexport.h>
10 #include <nap/resource.h>
11 #include <nap/signalslot.h>
12 #include <rtti/typeinfo.h>
13 
14 // Local includes
15 #include "uniformcontainer.h"
16 #include "descriptorsetcache.h"
17 #include "material.h"
18 
19 namespace nap
20 {
21  class Material;
22  class RenderService;
23  struct DescriptorSet;
24  class DescriptorSetCache;
25 
26  namespace material
27  {
28  namespace instance
29  {
30  // RTTI get or create material function
31  constexpr const char* getOrCreateMaterial = "getOrCreateMaterial";
32  }
33  }
34 
39  {
40  RTTI_ENABLE()
41  public:
42  std::vector<ResourcePtr<UniformStruct>> mUniforms;
43  std::vector<ResourcePtr<Sampler>> mSamplers;
44  std::vector<ResourcePtr<BufferBinding>> mBuffers;
45  std::vector<ResourcePtr<ShaderConstant>> mConstants;
46 
50  rttr::property getMaterialProperty() const;
51 
55  const std::string& getMaterialPropertyName() const;
56 
57  protected:
58  BaseMaterialInstanceResource(std::string&& materialPropertyName);
59 
60  protected:
61  std::string mMaterialPropertyName;
62  };
63 
69  {
70  RTTI_ENABLE(BaseMaterialInstanceResource)
71  public:
72  static constexpr const char* matProperty = "Material";
73 
75  BaseMaterialInstanceResource(matProperty) {}
76 
80  };
81 
87  {
88  RTTI_ENABLE(BaseMaterialInstanceResource)
89  public:
90  static constexpr const char* matProperty = "ComputeMaterial";
91 
93  BaseMaterialInstanceResource(matProperty) {}
94 
96  };
97 
102  {
103  RTTI_ENABLE(UniformContainer)
104  friend class RenderService;
105  public:
114  virtual UniformStructInstance* getOrCreateUniform(const std::string& name);
115 
129  template<class T>
130  T* getOrCreateBuffer(const std::string& name);
131 
140  BufferBindingInstance* getOrCreateBuffer(const std::string& name) { return getOrCreateBufferInternal(name); }
141 
154  template<class T>
155  T* getOrCreateSampler(const std::string& name);
156 
165  SamplerInstance* getOrCreateSampler(const std::string& name) { return getOrCreateSamplerInternal(name, nullptr); }
166 
181  template<class T>
182  T* getOrCreateSampler(const Sampler& resource);
183 
194  SamplerInstance* getOrCreateSampler(const Sampler& resource) { return getOrCreateSamplerInternal(resource.mName, &resource); }
195 
199  BaseMaterial* getMaterial() { assert(mMaterial != nullptr); return mMaterial; }
200 
204  const BaseMaterial* getMaterial() const { assert(mMaterial != nullptr); return mMaterial; }
205 
218  virtual const DescriptorSet& update();
219 
220  protected:
221  friend class RenderableMesh; // For responding to pipeline state events
222 
223  bool initInternal(RenderService& renderService, BaseMaterial& material, BaseMaterialInstanceResource& instanceResource, utility::ErrorState& errorState);
224  void rebuildUBO(UniformBufferObject& ubo, UniformStructInstance* overrideStruct);
225 
226  void onUniformCreated();
227  void onSamplerChanged(int imageStartIndex, SamplerInstance& samplerInstance, int imageArrayIndex);
228  void onBufferChanged(int storageBufferIndex, BufferBindingInstance& bindingInstance);
229 
230  void updateBuffers(const DescriptorSet& descriptorSet);
231  bool initBuffers(BaseMaterialInstanceResource& resource, utility::ErrorState& errorState);
232 
233  void updateSamplers(const DescriptorSet& descriptorSet);
234  bool initSamplers(BaseMaterialInstanceResource& resource, utility::ErrorState& errorState);
235  void addImageInfo(const Texture& texture, VkSampler sampler);
236 
237  bool initConstants(BaseMaterialInstanceResource& resource, utility::ErrorState& errorState);
238 
239  BufferBindingInstance* getOrCreateBufferInternal(const std::string& name);
240  SamplerInstance* getOrCreateSamplerInternal(const std::string& name, const Sampler* sampler);
241 
245  const ShaderStageConstantMap& getShaderStageConstantMap() const { return mShaderStageConstantMap; }
246 
250  ShaderConstantHash getConstantHash() const { return mConstantHash; }
251 
252  protected:
253  VkDevice mDevice = nullptr; // Vulkan device
254  RenderService* mRenderService = nullptr; // RenderService
255  BaseMaterial* mMaterial = nullptr; // Material
256  BaseMaterialInstanceResource* mResource = nullptr; // Material Instance Resource
257 
258  DescriptorSetCache* mDescriptorSetCache; // Cache used to acquire Vulkan DescriptorSets on each update
259  std::vector<UniformBufferObject> mUniformBufferObjects; // List of all UBO instances
260 
261  std::vector<VkWriteDescriptorSet> mStorageWriteDescriptorSets; // List of storage storage descriptors, used to update Descriptor Sets
262  std::vector<VkDescriptorBufferInfo> mStorageDescriptors; // List of storage buffers, used to update Descriptor Sets.
263 
264  std::vector<VkWriteDescriptorSet> mSamplerWriteDescriptorSets; // List of sampler descriptors, used to update Descriptor Sets
265  std::vector<VkDescriptorImageInfo> mSamplerDescriptors; // List of sampler images, used to update Descriptor Sets.
266 
267  ShaderStageConstantMap mShaderStageConstantMap; // Reference of all shader constants per shader stage, generated on materialinstance init
268  ShaderConstantHash mConstantHash; // Shader constant hash used to create a pipeline key
269 
270  bool mUniformsCreated = false; // Set when a uniform instance is created in between draws
271  };
272 
298  {
299  RTTI_ENABLE(BaseMaterialInstance)
300  public:
301 
305  bool init(RenderService& renderService, MaterialInstanceResource& resource, utility::ErrorState& errorState);
306 
311 
315  const Material& getMaterial() const { return static_cast<const Material&>(*BaseMaterialInstance::getMaterial()); }
316 
320  EBlendMode getBlendMode() const;
321 
328  void setBlendMode(EBlendMode blendMode);
329 
336  void setDepthMode(EDepthMode depthMode);
337 
341  EDepthMode getDepthMode() const;
342 
343  private:
344  MaterialInstanceResource* mResource; // Resource this instance is associated with
345  };
346 
365  {
366  RTTI_ENABLE(BaseMaterialInstance)
367  public:
368 
372  bool init(RenderService& renderService, ComputeMaterialInstanceResource& resource, utility::ErrorState& errorState);
373 
378 
382  const ComputeMaterial& getMaterial() const { return static_cast<const ComputeMaterial&>(*BaseMaterialInstance::getMaterial()); }
383 
387  glm::uvec3 getWorkGroupSize() const;
388 
389  private:
390  ComputeMaterialInstanceResource* mResource; // Resource this instance is associated with
391  };
392 
393 
395  // Template definitions
397 
398  template<class T>
399  T* BaseMaterialInstance::getOrCreateBuffer(const std::string& name)
400  {
401  return rtti_cast<T>(getOrCreateBufferInternal(name));
402  }
403 
404  template<class T>
405  T* BaseMaterialInstance::getOrCreateSampler(const std::string& name)
406  {
407  return rtti_cast<T>(getOrCreateSamplerInternal(name, nullptr));
408  }
409 
410  template<class T>
412  {
413  return rtti_cast<T>(getOrCreateSamplerInternal(resource.mName, &resource));
414  }
415 }
nap::BaseMaterialInstance::getOrCreateBufferInternal
BufferBindingInstance * getOrCreateBufferInternal(const std::string &name)
nap::BaseMaterialInstance::mDescriptorSetCache
DescriptorSetCache * mDescriptorSetCache
Definition: materialinstance.h:258
nap::BaseMaterialInstance::mSamplerDescriptors
std::vector< VkDescriptorImageInfo > mSamplerDescriptors
Definition: materialinstance.h:265
nap::ShaderConstantHash
uint ShaderConstantHash
Definition: materialcommon.h:71
nap::DescriptorSetCache
Definition: descriptorsetcache.h:48
nap::BaseMaterialInstance
Definition: materialinstance.h:101
nap::BaseMaterialInstanceResource::mMaterialPropertyName
std::string mMaterialPropertyName
Definition: materialinstance.h:61
nap::MaterialInstance::getMaterial
Material & getMaterial()
Definition: materialinstance.h:310
nap::Texture
Definition: texture.h:28
nap::BaseMaterial
Definition: material.h:41
nap::ComputeMaterial
Definition: material.h:183
nap::BaseMaterialInstance::getShaderStageConstantMap
const ShaderStageConstantMap & getShaderStageConstantMap() const
Definition: materialinstance.h:245
nap::ComputeMaterialInstanceResource
Definition: materialinstance.h:86
nap::EBlendMode
EBlendMode
Definition: materialcommon.h:18
nap::BaseMaterialInstance::mStorageDescriptors
std::vector< VkDescriptorBufferInfo > mStorageDescriptors
Definition: materialinstance.h:262
nap::ComputeMaterialInstance::getMaterial
ComputeMaterial & getMaterial()
Definition: materialinstance.h:377
nap::BaseMaterialInstance::getOrCreateBuffer
T * getOrCreateBuffer(const std::string &name)
Definition: materialinstance.h:399
nap::BaseMaterialInstance::getOrCreateSampler
SamplerInstance * getOrCreateSampler(const std::string &name)
Definition: materialinstance.h:165
nap::rtti::ObjectPtr
Definition: objectptr.h:154
nap::BaseMaterialInstanceResource::mBuffers
std::vector< ResourcePtr< BufferBinding > > mBuffers
Property: "Buffers" buffer bindings to override.
Definition: materialinstance.h:44
nap::ComputeMaterialInstanceResource::mComputeMaterial
ResourcePtr< ComputeMaterial > mComputeMaterial
Property: "ComputeMaterial" source material.
Definition: materialinstance.h:95
nap::EDepthMode
EDepthMode
Definition: materialcommon.h:40
nap::material::instance::getOrCreateMaterial
constexpr const char * getOrCreateMaterial
Definition: materialinstance.h:31
nap::BaseMaterialInstanceResource::mSamplers
std::vector< ResourcePtr< Sampler > > mSamplers
Property: "Samplers" samplers that you're overriding.
Definition: materialinstance.h:43
nap::BufferBindingInstance
Definition: bufferbindinginstance.h:73
nap::utility::ErrorState
Definition: errorstate.h:19
nap::EDepthMode::NotSet
@ NotSet
Default value for MaterialInstances, means that the Material's blend is used instead.
nap::Material
Definition: material.h:83
nap::Sampler::mName
std::string mName
Property: 'Name' sampler shader name.
Definition: sampler.h:92
nap::Sampler
Definition: sampler.h:86
nap::EBlendMode::NotSet
@ NotSet
Default value for MaterialInstances, means that the Material's blend mode is used instead.
nap::BaseMaterialInstanceResource::mUniforms
std::vector< ResourcePtr< UniformStruct > > mUniforms
Property: "Uniforms" uniform structs to override.
Definition: materialinstance.h:42
nap::RenderService
Definition: renderservice.h:275
nap::SamplerInstance
Definition: samplerinstance.h:18
nap::ComputeMaterialInstanceResource::ComputeMaterialInstanceResource
ComputeMaterialInstanceResource()
Definition: materialinstance.h:92
nap::BaseMaterialInstance::getOrCreateSampler
T * getOrCreateSampler(const std::string &name)
Definition: materialinstance.h:405
nap::BaseMaterialInstanceResource::mConstants
std::vector< ResourcePtr< ShaderConstant > > mConstants
Property: "Constants" shader constants to override.
Definition: materialinstance.h:45
nap::MaterialInstanceResource::MaterialInstanceResource
MaterialInstanceResource()
Definition: materialinstance.h:74
nap::BaseMaterialInstance::getOrCreateSampler
SamplerInstance * getOrCreateSampler(const Sampler &resource)
Definition: materialinstance.h:194
nap::BaseMaterialInstance::mConstantHash
ShaderConstantHash mConstantHash
Definition: materialinstance.h:268
nap::RenderableMesh
Definition: renderablemesh.h:22
nap::MaterialInstance
Definition: materialinstance.h:297
nap::BaseMaterialInstance::mShaderStageConstantMap
ShaderStageConstantMap mShaderStageConstantMap
Definition: materialinstance.h:267
nap::ComputeMaterialInstance
Definition: materialinstance.h:364
nap::UniformBufferObject
Definition: materialcommon.h:80
nap::BaseMaterialInstance::getMaterial
BaseMaterial * getMaterial()
Definition: materialinstance.h:199
nap::DescriptorSet
Definition: descriptorsetcache.h:29
nap
Definition: templateapp.h:17
nap::BaseMaterialInstance::getMaterial
const BaseMaterial * getMaterial() const
Definition: materialinstance.h:204
nap::UniformStructInstance
Definition: uniforminstance.h:53
nap::MaterialInstanceResource::mMaterial
ResourcePtr< Material > mMaterial
Property: "Material" Source material.
Definition: materialinstance.h:77
nap::BaseMaterialInstanceResource
Definition: materialinstance.h:38
nap::BaseMaterialInstance::mStorageWriteDescriptorSets
std::vector< VkWriteDescriptorSet > mStorageWriteDescriptorSets
Definition: materialinstance.h:261
nap::BaseMaterialInstance::getConstantHash
ShaderConstantHash getConstantHash() const
Definition: materialinstance.h:250
nap::MaterialInstance::getMaterial
const Material & getMaterial() const
Definition: materialinstance.h:315
nap::UniformContainer
Definition: uniformcontainer.h:20
nap::BaseMaterialInstance::mUniformBufferObjects
std::vector< UniformBufferObject > mUniformBufferObjects
Definition: materialinstance.h:259
nap::BaseMaterialInstance::mSamplerWriteDescriptorSets
std::vector< VkWriteDescriptorSet > mSamplerWriteDescriptorSets
Definition: materialinstance.h:264
nap::ComputeMaterialInstance::getMaterial
const ComputeMaterial & getMaterial() const
Definition: materialinstance.h:382
nap::ShaderStageConstantMap
std::map< VkShaderStageFlagBits, ShaderConstantMap > ShaderStageConstantMap
Definition: shaderconstantdeclaration.h:20
nap::BaseMaterialInstance::getOrCreateSamplerInternal
SamplerInstance * getOrCreateSamplerInternal(const std::string &name, const Sampler *sampler)
nap::MaterialInstanceResource
Definition: materialinstance.h:68