NAP
uniforminstance.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 "uniform.h"
9 #include "gpubuffer.h"
10 
11 // External Includes
12 #include <rtti/objectptr.h>
13 #include <glm/glm.hpp>
14 #include <utility/dllexport.h>
15 #include <nap/resource.h>
16 
17 namespace nap
18 {
19  // Forward Declares
20  class UniformInstance;
21 
22  using UniformCreatedCallback = std::function<void()>;
23 
29  class NAPAPI UniformInstance
30  {
31  RTTI_ENABLE()
32 
33  public:
34  // Default Destructor
35  virtual ~UniformInstance() = default;
36 
41  virtual const ShaderVariableDeclaration& getDeclaration() const = 0;
42  };
43 
44 
46  // UniformStructInstance
48 
53  class NAPAPI UniformStructInstance : public UniformInstance
54  {
55  RTTI_ENABLE(UniformInstance)
56 
57  public:
58  // Constructor
59  UniformStructInstance(const ShaderVariableStructDeclaration& declaration, const UniformCreatedCallback& uniformCreatedCallback) :
60  mUniformCreatedCallback(uniformCreatedCallback),
61  mDeclaration(declaration)
62  { }
63 
64  // Delete copy assignment operator and copy constructor
66  UniformStructInstance& operator=(const UniformStructInstance&) = delete;
67 
71  const std::vector<std::unique_ptr<UniformInstance>>& getUniforms() const { return mUniforms; }
72 
78  UniformInstance* findUniform(const std::string& name);
79 
85  template<typename T>
86  T* findUniform(const std::string& name);
87 
93  template<typename T>
94  T* getOrCreateUniform(const std::string& name);
95 
99  virtual const ShaderVariableDeclaration& getDeclaration() const override { return mDeclaration; }
100 
101  private:
102  friend class BaseMaterial;
103  friend class ComputeMaterial;
104  friend class Material;
105  friend class BaseMaterialInstance;
106  friend class MaterialInstance;
107 
111  bool addUniformRecursive(const ShaderVariableStructDeclaration& structDeclaration, const UniformStruct* structResource, const UniformCreatedCallback& uniformCreatedCallback, bool createDefaults, utility::ErrorState& errorState);
112 
118  static std::unique_ptr<UniformInstance> createUniformFromDeclaration(const ShaderVariableDeclaration& declaration, const UniformCreatedCallback& uniformCreatedCallback);
119 
120  UniformCreatedCallback mUniformCreatedCallback;
121  const ShaderVariableStructDeclaration& mDeclaration;
122  std::vector<std::unique_ptr<UniformInstance>> mUniforms;
123  };
124 
125 
127  // UniformStructArrayInstance
129 
134  {
135  friend class UniformStructInstance;
136  RTTI_ENABLE(UniformInstance)
137  public:
138  // Constructor
140  mDeclaration(declaration)
141  { }
142 
143  // Copy construction and copy assignment not allowed
145  UniformStructArrayInstance& operator=(const UniformStructArrayInstance&) = delete;
146 
150  const std::vector<std::unique_ptr<UniformStructInstance>>& getElements() const { return mElements; }
151 
155  int getNumElements() const { return static_cast<int>(mElements.size()); }
156 
160  int getMaxNumElements() const { return mDeclaration.mElements.size(); }
161 
165  UniformStructInstance& getElement(int index) { assert(index < mElements.size()); return *mElements[index]; }
166 
170  UniformStructInstance* findElement(int index);
171 
175  UniformStructInstance& operator[](size_t index) { return getElement(index); }
176 
180  virtual const ShaderVariableDeclaration& getDeclaration() const override { return mDeclaration; }
181 
182  private:
183  const ShaderVariableStructArrayDeclaration& mDeclaration;
184  std::vector<std::unique_ptr<UniformStructInstance>> mElements;
185 
190  void addElement(std::unique_ptr<UniformStructInstance> element);
191  };
192 
193 
195  // UniformLeafInstance
197 
202  class NAPAPI UniformLeafInstance : public UniformInstance
203  {
204  RTTI_ENABLE(UniformInstance)
205  public:
209  virtual void push(uint8* uniformBuffer) const = 0;
210  };
211 
212 
214  // Uniform Values
216 
221  {
222  RTTI_ENABLE(UniformLeafInstance)
223  public:
224 
225  // Constructor
227  mDeclaration(&declaration) { }
228 
232  virtual const ShaderVariableDeclaration& getDeclaration() const override { return *mDeclaration; }
233 
234  protected:
235  const ShaderVariableValueDeclaration* mDeclaration = nullptr;
236  };
237 
238 
242  template<class T>
244  {
245  RTTI_ENABLE(UniformValueInstance)
246 
247  public:
249  UniformValueInstance(declaration) { }
250 
255  void setValue(const T& value) { mValue = value; }
256 
260  const T& getValue() const { return mValue; }
261 
266  void set(const TypedUniformValue<T>& resource) { mValue = resource.mValue; }
267 
272  virtual void push(uint8_t* uniformBuffer) const override;
273 
274  private:
275  T mValue = T();
276  };
277 
278 
280  // Uniform Value Array
282 
287  {
288  RTTI_ENABLE(UniformLeafInstance)
289 
290  public:
292  mDeclaration(&declaration) { }
293 
297  virtual const ShaderVariableDeclaration& getDeclaration() const override { return *mDeclaration; }
298 
302  int getMaxNumElements() const { return mDeclaration->mNumElements; }
303 
307  virtual void setDefault() = 0;
308 
309  protected:
311  };
312 
313 
319  template<typename T>
321  {
322  RTTI_ENABLE(UniformValueArrayInstance)
323 
324  public:
326  UniformValueArrayInstance(declaration) { }
327 
332  void set(const TypedUniformValueArray<T>& resource) { mValues = resource.mValues; }
333 
339  void setValues(const std::vector<T>& values) { assert(values.size() <= mDeclaration->mNumElements); mValues = values; }
340 
347  void setValue(T value, int index) { assert(index < mValues.size()); mValues[index] = value; }
348 
352  virtual void setDefault() override { mValues.resize(mDeclaration->mNumElements, T()); }
353 
357  int getNumElements() const { return static_cast<int>(mValues.size()); }
358 
362  std::vector<T>& getValues() { return mValues; }
363 
368  virtual void push(uint8* uniformBuffer) const override;
369 
375  T& operator[](size_t index) { assert(index < mValues.size()); return mValues[index]; }
376 
377 
378  private:
379  std::vector<T> mValues;
380  };
381 
382 
384  // Type definitions for all supported uniform instance value types
386 
396 
397 
399  // Type definitions for all supported uniform instance array value types
401 
411 
412 
414  // Template definitions
416 
417  template<typename T>
418  T* nap::UniformStructInstance::findUniform(const std::string& name)
419  {
420  UniformInstance* instance = findUniform(name);
421  if (instance != nullptr)
422  return rtti_cast<T>(instance);
423  return nullptr;
424  }
425 
426  template<typename T>
428  {
429  // First try to find it, if found cast and return
430  UniformInstance* instance = findUniform(name);
431  if (instance != nullptr)
432  {
433  assert(instance->get_type().is_derived_from<T>());
434  return rtti_cast<T>(instance);
435  }
436 
437  // Otherwise fetch the declaration and use it to create the new instance
438  const ShaderVariableDeclaration* declaration = mDeclaration.findMember(name);
439  if (declaration == nullptr)
440  return nullptr;
441 
442  std::unique_ptr<UniformInstance> new_instance = createUniformFromDeclaration(*declaration, mUniformCreatedCallback);
443  T* result = rtti_cast<T>(new_instance.get());
444  assert(result != nullptr);
445  mUniforms.emplace_back(std::move(new_instance));
446 
447  // Notify listeners
448  if (mUniformCreatedCallback)
449  mUniformCreatedCallback();
450  return result;
451  }
452 
453  template<class T>
455  {
456  assert(sizeof(mValue) == mDeclaration->mSize);
457  memcpy(uniformBuffer + mDeclaration->mOffset, &mValue, sizeof(mValue));
458  }
459 
460  template<typename T>
462  {
463  if (sizeof(T) == mDeclaration->mStride)
464  {
465  size_t size = mValues.size() * sizeof(T);
466  memcpy(uniformBuffer + mDeclaration->mOffset, mValues.data(), size);
467  }
468  else
469  {
470  uint8_t* dest = uniformBuffer + mDeclaration->mOffset;
471  for (const T& value : mValues)
472  {
473  memcpy(dest, &value, sizeof(value));
474  dest += mDeclaration->mStride;
475  }
476  }
477  }
478 }
nap::UniformStructArrayInstance::getNumElements
int getNumElements() const
Definition: uniforminstance.h:155
nap::ShaderVariableDeclaration
Definition: shadervariabledeclarations.h:58
nap::UniformStructArrayInstance::UniformStructArrayInstance
UniformStructArrayInstance(const ShaderVariableStructArrayDeclaration &declaration)
Definition: uniforminstance.h:139
nap::BaseMaterialInstance
Definition: materialinstance.h:101
nap::UniformValueInstance::getDeclaration
virtual const ShaderVariableDeclaration & getDeclaration() const override
Definition: uniforminstance.h:232
nap::UniformStructArrayInstance::getElements
const std::vector< std::unique_ptr< UniformStructInstance > > & getElements() const
Definition: uniforminstance.h:150
nap::UniformStructInstance::getOrCreateUniform
T * getOrCreateUniform(const std::string &name)
Definition: uniforminstance.h:427
nap::BaseMaterial
Definition: material.h:41
nap::ComputeMaterial
Definition: material.h:183
nap::UniformStructArrayInstance::getElement
UniformStructInstance & getElement(int index)
Definition: uniforminstance.h:165
nap::TypedUniformValueArrayInstance::TypedUniformValueArrayInstance
TypedUniformValueArrayInstance(const ShaderVariableValueArrayDeclaration &declaration)
Definition: uniforminstance.h:325
nap::UniformValueArrayInstance::UniformValueArrayInstance
UniformValueArrayInstance(const ShaderVariableValueArrayDeclaration &declaration)
Definition: uniforminstance.h:291
nap::UniformStructInstance::getDeclaration
virtual const ShaderVariableDeclaration & getDeclaration() const override
Definition: uniforminstance.h:99
nap::TypedUniformValueArrayInstance::getValues
std::vector< T > & getValues()
Definition: uniforminstance.h:362
nap::UniformCreatedCallback
std::function< void()> UniformCreatedCallback
Definition: uniform.h:17
nap::UniformStructInstance::UniformStructInstance
UniformStructInstance(const ShaderVariableStructDeclaration &declaration, const UniformCreatedCallback &uniformCreatedCallback)
Definition: uniforminstance.h:59
nap::uint8
uint8_t uint8
Definition: numeric.h:16
nap::TypedUniformValueArray::mValues
std::vector< T > mValues
Definition: uniform.h:189
nap::ShaderVariableValueArrayDeclaration::mNumElements
int mNumElements
Total number of elements in list.
Definition: shadervariabledeclarations.h:162
nap::UniformValueArrayInstance::mDeclaration
const ShaderVariableValueArrayDeclaration * mDeclaration
Definition: uniforminstance.h:310
nap::TypedUniformValueInstance::set
void set(const TypedUniformValue< T > &resource)
Definition: uniforminstance.h:266
nap::TypedUniformValueInstance::TypedUniformValueInstance
TypedUniformValueInstance(const ShaderVariableValueDeclaration &declaration)
Definition: uniforminstance.h:248
nap::UniformStructArrayInstance
Definition: uniforminstance.h:133
nap::TypedUniformValueArrayInstance::operator[]
T & operator[](size_t index)
Definition: uniforminstance.h:375
nap::utility::ErrorState
Definition: errorstate.h:19
nap::TypedUniformValueArrayInstance::getNumElements
int getNumElements() const
Definition: uniforminstance.h:357
nap::Material
Definition: material.h:83
nap::ShaderVariableStructArrayDeclaration
Definition: shadervariabledeclarations.h:119
nap::TypedUniformValueInstance::getValue
const T & getValue() const
Definition: uniforminstance.h:260
nap::UniformValueArrayInstance::getMaxNumElements
int getMaxNumElements() const
Definition: uniforminstance.h:302
nap::TypedUniformValueArrayInstance::set
void set(const TypedUniformValueArray< T > &resource)
Definition: uniforminstance.h:332
nap::UniformLeafInstance
Definition: uniforminstance.h:202
nap::TypedUniformValueArray
Definition: uniform.h:181
nap::TypedUniformValue::mValue
T mValue
Definition: uniform.h:140
nap::UniformStructArrayInstance::getMaxNumElements
int getMaxNumElements() const
Definition: uniforminstance.h:160
nap::TypedUniformValueArrayInstance::push
virtual void push(uint8 *uniformBuffer) const override
Definition: uniforminstance.h:461
nap::TypedUniformValueInstance::setValue
void setValue(const T &value)
Definition: uniforminstance.h:255
nap::MaterialInstance
Definition: materialinstance.h:297
nap::UniformValueArrayInstance::getDeclaration
virtual const ShaderVariableDeclaration & getDeclaration() const override
Definition: uniforminstance.h:297
nap::UniformStructInstance::findUniform
UniformInstance * findUniform(const std::string &name)
nap::TypedUniformValueArrayInstance::setDefault
virtual void setDefault() override
Definition: uniforminstance.h:352
nap::ShaderVariableStructDeclaration
Definition: shadervariabledeclarations.h:95
nap::TypedUniformValueArrayInstance::setValues
void setValues(const std::vector< T > &values)
Definition: uniforminstance.h:339
nap::UniformValueArrayInstance
Definition: uniforminstance.h:286
nap
Definition: templateapp.h:17
nap::UniformValueInstance::UniformValueInstance
UniformValueInstance(const ShaderVariableValueDeclaration &declaration)
Definition: uniforminstance.h:226
nap::TypedUniformValue
Definition: uniform.h:136
nap::ShaderVariableValueDeclaration
Definition: shadervariabledeclarations.h:82
nap::TypedUniformValueArrayInstance::setValue
void setValue(T value, int index)
Definition: uniforminstance.h:347
nap::UniformStructInstance
Definition: uniforminstance.h:53
nap::TypedUniformValueInstance
Definition: uniforminstance.h:243
nap::UniformValueInstance
Definition: uniforminstance.h:220
nap::UniformStructArrayInstance::operator[]
UniformStructInstance & operator[](size_t index)
Definition: uniforminstance.h:175
nap::UniformStructArrayInstance::getDeclaration
virtual const ShaderVariableDeclaration & getDeclaration() const override
Definition: uniforminstance.h:180
nap::UniformInstance
Definition: uniforminstance.h:29
nap::TypedUniformValueArrayInstance
Definition: uniforminstance.h:320
nap::UniformStructInstance::getUniforms
const std::vector< std::unique_ptr< UniformInstance > > & getUniforms() const
Definition: uniforminstance.h:71
nap::ShaderVariableValueArrayDeclaration
Definition: shadervariabledeclarations.h:155
nap::TypedUniformValueInstance::push
virtual void push(uint8_t *uniformBuffer) const override
Definition: uniforminstance.h:454
nap::UniformStruct
Definition: uniform.h:51