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) { this->copy(rhs); }
34 
35  // Copy assignment operator
36  RenderableMesh& operator=(const RenderableMesh& rhs) { this->copy(rhs); return *this; }
37 
38  // Move constructor
39  RenderableMesh(RenderableMesh&& other) { this->move(std::move(other)); }
40 
41  // Move assignment operator
42  RenderableMesh& operator=(RenderableMesh&& other) { this->move(std::move(other)); return *this; }
43 
44  // Object is similar when sharing mesh / material combination
45  bool operator==(const RenderableMesh& rhs) const { return mMaterialInstance == rhs.mMaterialInstance && mMesh == rhs.mMesh; }
46 
47  // Object is different when not sharing mesh / material combination
48  bool operator!=(const RenderableMesh& rhs) const { return !(rhs == *this); }
49 
54  bool isValid() const { return mMesh != nullptr; }
55 
59  IMesh& getMesh() { return *mMesh; }
60 
64  const IMesh& getMesh() const { return *mMesh; }
65 
69  MaterialInstance& getMaterialInstance() { return *mMaterialInstance; }
70 
74  const MaterialInstance& getMaterialInstance() const { return *mMaterialInstance; }
75 
79  const std::vector<VkBuffer>& getVertexBuffers();
80 
84  const std::vector<VkDeviceSize>& getVertexBufferOffsets() const { return mVertexBufferOffsets; }
85 
91  int getVertexBufferBindingIndex(const std::string& meshVertexAttributeID) const;
92 
93  protected:
99  RenderableMesh(IMesh& mesh, MaterialInstance& materialInstance);
100 
101  private:
102  void onVertexBufferDataChanged() { mVertexBuffersDirty = true; }
103  void move(RenderableMesh&& other);
104  void copy(const RenderableMesh& rhs);
105 
106  private:
107  MaterialInstance* mMaterialInstance = nullptr;
108  IMesh* mMesh = nullptr;
109  std::vector<VkBuffer> mVertexBuffers;
110  std::vector<VkDeviceSize> mVertexBufferOffsets;
111  bool mVertexBuffersDirty = true;
112  nap::Slot<> mVertexBufferDataChangedSlot = { [&]() { onVertexBufferDataChanged(); } };
113  };
114 }
115 
116 
118 // hash
120 
121 namespace std
122 {
123  template<>
124  struct hash<nap::RenderableMesh>
125  {
126  size_t operator()(const nap::RenderableMesh& key) const
127  {
128  assert(key.isValid());
129  size_t mesh_hash = hash<size_t>{}((size_t)&key.getMesh());
130  size_t mate_hash = hash<size_t>{}((size_t)&key.getMaterialInstance());
131  return mesh_hash ^ mate_hash;
132  }
133  };
134 }
nap::RenderableMesh::getVertexBufferOffsets
const std::vector< VkDeviceSize > & getVertexBufferOffsets() const
Definition: renderablemesh.h:84
nap::RenderableMesh::getMaterialInstance
MaterialInstance & getMaterialInstance()
Definition: renderablemesh.h:69
nap::RenderableMesh::RenderableMesh
RenderableMesh(RenderableMesh &&other)
Definition: renderablemesh.h:39
nap::Slot
Definition: signalslot.h:21
nap::RenderableMesh::getMesh
const IMesh & getMesh() const
Definition: renderablemesh.h:64
nap::RenderableMesh::operator!=
bool operator!=(const RenderableMesh &rhs) const
Definition: renderablemesh.h:48
nap::RenderableMesh::RenderableMesh
RenderableMesh(const RenderableMesh &rhs)
Definition: renderablemesh.h:33
nap::IMesh
Definition: mesh.h:394
nap::RenderService
Definition: renderservice.h:275
nap::RenderableMesh::operator=
RenderableMesh & operator=(RenderableMesh &&other)
Definition: renderablemesh.h:42
nap::RenderableMesh::getMesh
IMesh & getMesh()
Definition: renderablemesh.h:59
nap::RenderableMesh
Definition: renderablemesh.h:22
nap::MaterialInstance
Definition: materialinstance.h:297
nap
Definition: templateapp.h:17
nap::RenderableMesh::operator==
bool operator==(const RenderableMesh &rhs) const
Definition: renderablemesh.h:45
nap::RenderableMesh::operator=
RenderableMesh & operator=(const RenderableMesh &rhs)
Definition: renderablemesh.h:36
nap::RenderableMesh::isValid
bool isValid() const
Definition: renderablemesh.h:54
nap::RenderableMesh::getMaterialInstance
const MaterialInstance & getMaterialInstance() const
Definition: renderablemesh.h:74