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 
59  // Constructor
60  UniformStructInstance(const ShaderVariableStructDeclaration& declaration, const UniformCreatedCallback& uniformCreatedCallback) :
61  mUniformCreatedCallback(uniformCreatedCallback),
62  mDeclaration(declaration)
63  { }
64 
65  // Delete copy assignment operator and copy constructor
67  UniformStructInstance& operator=(const UniformStructInstance&) = delete;
68 
72  const std::vector<std::unique_ptr<UniformInstance>>& getUniforms() const { return mUniforms; }
73 
79  UniformInstance* findUniform(const std::string& name);
80 
86  template<typename T>
87  T* findUniform(const std::string& name);
88 
94  template<typename T>
95  T* getOrCreateUniform(const std::string& name);
96 
100  virtual const ShaderVariableDeclaration& getDeclaration() const override { return mDeclaration; }
101 
102  private:
103  friend class BaseMaterial;
104  friend class ComputeMaterial;
105  friend class Material;
106  friend class BaseMaterialInstance;
107  friend class MaterialInstance;
108 
112  bool addUniformRecursive(const ShaderVariableStructDeclaration& structDeclaration, const UniformStruct* structResource, const UniformCreatedCallback& uniformCreatedCallback, bool createDefaults, utility::ErrorState& errorState);
113 
119  static std::unique_ptr<UniformInstance> createUniformFromDeclaration(const ShaderVariableDeclaration& declaration, const UniformCreatedCallback& uniformCreatedCallback);
120 
121  private:
122  UniformCreatedCallback mUniformCreatedCallback;
123  const ShaderVariableStructDeclaration& mDeclaration;
124  std::vector<std::unique_ptr<UniformInstance>> mUniforms;
125  };
126 
127 
129  // UniformStructArrayInstance
131 
136  {
137  friend class UniformStructInstance;
138  RTTI_ENABLE(UniformInstance)
139  public:
140  // Constructor
142  mDeclaration(declaration)
143  { }
144 
145  // Copy construction and copy assignment not allowed
147  UniformStructArrayInstance& operator=(const UniformStructArrayInstance&) = delete;
148 
152  const std::vector<std::unique_ptr<UniformStructInstance>>& getElements() const { return mElements; }
153 
157  UniformStructInstance& getElement(int index) { assert(index < mElements.size()); return *mElements[index]; }
158 
162  UniformStructInstance* findElement(int index);
163 
167  UniformStructInstance& operator[](size_t index) { return getElement(index); }
168 
172  virtual const ShaderVariableDeclaration& getDeclaration() const override { return mDeclaration; }
173 
174  private:
175  const ShaderVariableStructArrayDeclaration& mDeclaration;
176  std::vector<std::unique_ptr<UniformStructInstance>> mElements;
177 
182  void addElement(std::unique_ptr<UniformStructInstance> element);
183  };
184 
185 
187  // UniformLeafInstance
189 
194  class NAPAPI UniformLeafInstance : public UniformInstance
195  {
196  RTTI_ENABLE(UniformInstance)
197  public:
201  virtual void push(uint8* uniformBuffer) const = 0;
202  };
203 
204 
206  // Uniform Values
208 
213  {
214  RTTI_ENABLE(UniformLeafInstance)
215  public:
216 
217  // Constructor
219  mDeclaration(&declaration) { }
220 
224  virtual const ShaderVariableDeclaration& getDeclaration() const override { return *mDeclaration; }
225 
226  protected:
227  const ShaderVariableValueDeclaration* mDeclaration = nullptr;
228  };
229 
230 
234  template<class T>
236  {
237  RTTI_ENABLE(UniformValueInstance)
238 
239  public:
241  UniformValueInstance(declaration) { }
242 
247  void setValue(const T& value) { mValue = value; }
248 
252  const T& getValue() const { return mValue; }
253 
258  void set(const TypedUniformValue<T>& resource) { mValue = resource.mValue; }
259 
264  virtual void push(uint8_t* uniformBuffer) const override;
265 
266  private:
267  T mValue = T();
268  };
269 
270 
272  // Uniform Value Array
274 
279  {
280  RTTI_ENABLE(UniformLeafInstance)
281 
282  public:
284  mDeclaration(&declaration) { }
285 
289  virtual const ShaderVariableDeclaration& getDeclaration() const override { return *mDeclaration; }
290 
294  virtual void setDefault() = 0;
295 
296  protected:
298  };
299 
300 
306  template<typename T>
308  {
309  RTTI_ENABLE(UniformValueArrayInstance)
310 
311  public:
313  UniformValueArrayInstance(declaration) { }
314 
319  void set(const TypedUniformValueArray<T>& resource) { mValues = resource.mValues; }
320 
326  void setValues(const std::vector<T>& values) { assert(values.size() <= mDeclaration->mNumElements); mValues = values; }
327 
334  void setValue(T value, int index) { assert(index < mValues.size()); mValues[index] = value; }
335 
339  virtual void setDefault() override { mValues.resize(mDeclaration->mNumElements, T()); }
340 
344  int getNumElements() const { return static_cast<int>(mValues.size()); }
345 
349  std::vector<T>& getValues() { return mValues; }
350 
355  virtual void push(uint8* uniformBuffer) const override;
356 
362  T& operator[](size_t index) { assert(index < mValues.size()); return mValues[index]; }
363 
364 
365  private:
366  std::vector<T> mValues;
367  };
368 
369 
371  // Type definitions for all supported uniform instance value types
373 
383 
384 
386  // Type definitions for all supported uniform instance array value types
388 
398 
399 
401  // Template definitions
403 
404  template<typename T>
405  T* nap::UniformStructInstance::findUniform(const std::string& name)
406  {
407  UniformInstance* instance = findUniform(name);
408  if (instance != nullptr)
409  return rtti_cast<T>(instance);
410  return nullptr;
411  }
412 
413  template<typename T>
415  {
416  // First try to find it, if found cast and return
417  UniformInstance* instance = findUniform(name);
418  if (instance != nullptr)
419  {
420  assert(instance->get_type().is_derived_from<T>());
421  return rtti_cast<T>(instance);
422  }
423 
424  // Otherwise fetch the declaration and use it to create the new instance
425  const ShaderVariableDeclaration* declaration = mDeclaration.findMember(name);
426  if (declaration == nullptr)
427  return nullptr;
428 
429  std::unique_ptr<UniformInstance> new_instance = createUniformFromDeclaration(*declaration, mUniformCreatedCallback);
430  T* result = rtti_cast<T>(new_instance.get());
431  assert(result != nullptr);
432  mUniforms.emplace_back(std::move(new_instance));
433 
434  // Notify listeners
435  if (mUniformCreatedCallback)
436  mUniformCreatedCallback();
437  return result;
438  }
439 
440  template<class T>
442  {
443  assert(sizeof(mValue) == mDeclaration->mSize);
444  memcpy(uniformBuffer + mDeclaration->mOffset, &mValue, sizeof(mValue));
445  }
446 
447  template<typename T>
449  {
450  if (sizeof(T) == mDeclaration->mStride)
451  {
452  size_t size = mValues.size() * sizeof(T);
453  memcpy(uniformBuffer + mDeclaration->mOffset, mValues.data(), size);
454  }
455  else
456  {
457  uint8_t* dest = uniformBuffer + mDeclaration->mOffset;
458  for (const T& value : mValues)
459  {
460  memcpy(dest, &value, sizeof(value));
461  dest += mDeclaration->mStride;
462  }
463  }
464  }
465 }
nap::ShaderVariableDeclaration
Definition: shadervariabledeclarations.h:58
nap::UniformStructArrayInstance::UniformStructArrayInstance
UniformStructArrayInstance(const ShaderVariableStructArrayDeclaration &declaration)
Definition: uniforminstance.h:141
nap::BaseMaterialInstance
Definition: materialinstance.h:64
nap::UniformValueInstance::getDeclaration
virtual const ShaderVariableDeclaration & getDeclaration() const override
Definition: uniforminstance.h:224
nap::UniformStructArrayInstance::getElements
const std::vector< std::unique_ptr< UniformStructInstance > > & getElements() const
Definition: uniforminstance.h:152
nap::UniformStructInstance::getOrCreateUniform
T * getOrCreateUniform(const std::string &name)
Definition: uniforminstance.h:414
nap::BaseMaterial
Definition: material.h:30
nap::ComputeMaterial
Definition: material.h:172
nap::UniformStructArrayInstance::getElement
UniformStructInstance & getElement(int index)
Definition: uniforminstance.h:157
nap::TypedUniformValueArrayInstance::TypedUniformValueArrayInstance
TypedUniformValueArrayInstance(const ShaderVariableValueArrayDeclaration &declaration)
Definition: uniforminstance.h:312
nap::UniformValueArrayInstance::UniformValueArrayInstance
UniformValueArrayInstance(const ShaderVariableValueArrayDeclaration &declaration)
Definition: uniforminstance.h:283
nap::UniformStructInstance::getDeclaration
virtual const ShaderVariableDeclaration & getDeclaration() const override
Definition: uniforminstance.h:100
nap::TypedUniformValueArrayInstance::getValues
std::vector< T > & getValues()
Definition: uniforminstance.h:349
nap::UniformCreatedCallback
std::function< void()> UniformCreatedCallback
Definition: uniform.h:18
nap::UniformStructInstance::UniformStructInstance
UniformStructInstance(const ShaderVariableStructDeclaration &declaration, const UniformCreatedCallback &uniformCreatedCallback)
Definition: uniforminstance.h:60
nap::uint8
uint8_t uint8
Definition: numeric.h:16
nap::TypedUniformValueArray::mValues
std::vector< T > mValues
Definition: uniform.h:181
nap::ShaderVariableValueArrayDeclaration::mNumElements
int mNumElements
Total number of elements in list.
Definition: shadervariabledeclarations.h:153
nap::UniformValueArrayInstance::mDeclaration
const ShaderVariableValueArrayDeclaration * mDeclaration
Definition: uniforminstance.h:297
nap::TypedUniformValueInstance::set
void set(const TypedUniformValue< T > &resource)
Definition: uniforminstance.h:258
nap::TypedUniformValueInstance::TypedUniformValueInstance
TypedUniformValueInstance(const ShaderVariableValueDeclaration &declaration)
Definition: uniforminstance.h:240
nap::UniformStructArrayInstance
Definition: uniforminstance.h:135
nap::TypedUniformValueArrayInstance::operator[]
T & operator[](size_t index)
Definition: uniforminstance.h:362
nap::utility::ErrorState
Definition: errorstate.h:19
nap::TypedUniformValueArrayInstance::getNumElements
int getNumElements() const
Definition: uniforminstance.h:344
nap::Material
Definition: material.h:72
nap::ShaderVariableStructArrayDeclaration
Definition: shadervariabledeclarations.h:113
nap::TypedUniformValueInstance::getValue
const T & getValue() const
Definition: uniforminstance.h:252
nap::TypedUniformValueArrayInstance::set
void set(const TypedUniformValueArray< T > &resource)
Definition: uniforminstance.h:319
nap::UniformLeafInstance
Definition: uniforminstance.h:194
nap::TypedUniformValueArray
Definition: uniform.h:173
nap::TypedUniformValue::mValue
T mValue
Definition: uniform.h:132
nap::TypedUniformValueArrayInstance::push
virtual void push(uint8 *uniformBuffer) const override
Definition: uniforminstance.h:448
nap::TypedUniformValueInstance::setValue
void setValue(const T &value)
Definition: uniforminstance.h:247
nap::MaterialInstance
Definition: materialinstance.h:217
nap::UniformValueArrayInstance::getDeclaration
virtual const ShaderVariableDeclaration & getDeclaration() const override
Definition: uniforminstance.h:289
nap::UniformStructInstance::findUniform
UniformInstance * findUniform(const std::string &name)
nap::TypedUniformValueArrayInstance::setDefault
virtual void setDefault() override
Definition: uniforminstance.h:339
nap::ShaderVariableStructDeclaration
Definition: shadervariabledeclarations.h:87
nap::TypedUniformValueArrayInstance::setValues
void setValues(const std::vector< T > &values)
Definition: uniforminstance.h:326
nap::UniformValueArrayInstance
Definition: uniforminstance.h:278
nap
Definition: assert.h:10
nap::UniformValueInstance::UniformValueInstance
UniformValueInstance(const ShaderVariableValueDeclaration &declaration)
Definition: uniforminstance.h:218
nap::TypedUniformValue
Definition: uniform.h:128
nap::ShaderVariableValueDeclaration
Definition: shadervariabledeclarations.h:74
nap::TypedUniformValueArrayInstance::setValue
void setValue(T value, int index)
Definition: uniforminstance.h:334
nap::UniformStructInstance
Definition: uniforminstance.h:53
nap::TypedUniformValueInstance
Definition: uniforminstance.h:235
nap::UniformValueInstance
Definition: uniforminstance.h:212
nap::UniformStructArrayInstance::operator[]
UniformStructInstance & operator[](size_t index)
Definition: uniforminstance.h:167
nap::UniformStructArrayInstance::getDeclaration
virtual const ShaderVariableDeclaration & getDeclaration() const override
Definition: uniforminstance.h:172
nap::UniformInstance
Definition: uniforminstance.h:29
nap::TypedUniformValueArrayInstance
Definition: uniforminstance.h:307
nap::UniformStructInstance::getUniforms
const std::vector< std::unique_ptr< UniformInstance > > & getUniforms() const
Definition: uniforminstance.h:72
nap::ShaderVariableValueArrayDeclaration
Definition: shadervariabledeclarations.h:146
nap::TypedUniformValueInstance::push
virtual void push(uint8_t *uniformBuffer) const override
Definition: uniforminstance.h:441
nap::UniformStruct
Definition: uniform.h:43