NAP
renderablemesh.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 "mesh.h"
9 #include "materialinstance.h"
10 #include "nap/signalslot.h"
11 
12 namespace nap
13 {
14  // Forward Declares
15  class RenderService;
16 
22  class NAPAPI RenderableMesh final
23  {
24  friend class RenderService;
25  public:
30  RenderableMesh() = default;
31 
32  // Copy constructor
33  RenderableMesh(const RenderableMesh& rhs);
34 
35  // Copy assignment operator
36  RenderableMesh& operator=(const RenderableMesh& rhs);
37 
38  // Object is similar when sharing mesh / material combination
39  bool operator==(const RenderableMesh& rhs) const;
40 
45  bool isValid() const { return mMesh != nullptr; }
46 
50  IMesh& getMesh() { return *mMesh; }
51 
55  const IMesh& getMesh() const { return *mMesh; }
56 
60  MaterialInstance& getMaterialInstance() { return *mMaterialInstance; }
61 
65  const MaterialInstance& getMaterialInstance() const { return *mMaterialInstance; }
66 
70  const std::vector<VkBuffer>& getVertexBuffers();
71 
75  const std::vector<VkDeviceSize>& getVertexBufferOffsets() const { return mVertexBufferOffsets; }
76 
82  int getVertexBufferBindingIndex(const std::string& meshVertexAttributeID) const;
83 
84  protected:
90  RenderableMesh(IMesh& mesh, MaterialInstance& materialInstance);
91 
92  private:
93  void onVertexBufferDataChanged();
94 
95  private:
96  MaterialInstance* mMaterialInstance = nullptr;
97  IMesh* mMesh = nullptr;
98  std::vector<VkBuffer> mVertexBuffers;
99  std::vector<VkDeviceSize> mVertexBufferOffsets;
100  bool mVertexBuffersDirty = true;
101  nap::Slot<> mVertexBufferDataChangedSlot = { [&]() { onVertexBufferDataChanged(); } };
102  };
103 }
104 
105 
107 // hash
109 
110 namespace std
111 {
112  template<>
113  struct hash<nap::RenderableMesh>
114  {
115  size_t operator()(const nap::RenderableMesh& key) const
116  {
117  assert(key.isValid());
118  size_t mesh_hash = hash<size_t>{}((size_t)&key.getMesh());
119  size_t mate_hash = hash<size_t>{}((size_t)&key.getMaterialInstance());
120  return mesh_hash ^ mate_hash;
121  }
122  };
123 }
nap::RenderableMesh::getVertexBufferOffsets
const std::vector< VkDeviceSize > & getVertexBufferOffsets() const
Definition: renderablemesh.h:75
nap::RenderableMesh::getMaterialInstance
MaterialInstance & getMaterialInstance()
Definition: renderablemesh.h:60
nap::Slot
Slot.
Definition: signalslot.h:21
nap::RenderableMesh::getMesh
const IMesh & getMesh() const
Definition: renderablemesh.h:55
nap::IMesh
Definition: mesh.h:394
nap::RenderService
Definition: renderservice.h:275
nap::RenderableMesh::getMesh
IMesh & getMesh()
Definition: renderablemesh.h:50
nap::RenderableMesh
Definition: renderablemesh.h:22
nap::MaterialInstance
Definition: materialinstance.h:297
nap
Definition: templateapp.h:17
nap::RenderableMesh::isValid
bool isValid() const
Definition: renderablemesh.h:45
nap::RenderableMesh::getMaterialInstance
const MaterialInstance & getMaterialInstance() const
Definition: renderablemesh.h:65