6
6
#define __NBL_ASSET_I_CPU_MESH_BUFFER_H_INCLUDED__
7
7
8
8
#include " nbl/asset/IMeshBuffer.h"
9
+ #include " nbl/asset/ICPUSkeleton.h"
9
10
#include " nbl/asset/ICPUDescriptorSet.h"
10
11
#include " nbl/asset/ICPURenderpassIndependentPipeline.h"
11
12
#include " nbl/asset/bawformat/blobs/MeshBufferBlob.h"
@@ -57,29 +58,27 @@ namespace impl
57
58
}
58
59
}
59
60
60
- class ICPUMeshBuffer : public IMeshBuffer <ICPUBuffer, ICPUDescriptorSet, ICPURenderpassIndependentPipeline>, public BlobSerializable, public IAsset
61
+ class ICPUMeshBuffer : public IMeshBuffer <ICPUBuffer,ICPUDescriptorSet,ICPURenderpassIndependentPipeline,ICPUSkeleton >, public BlobSerializable, public IAsset
61
62
{
62
- using base_t = IMeshBuffer<ICPUBuffer, ICPUDescriptorSet, ICPURenderpassIndependentPipeline>;
63
+ using base_t = IMeshBuffer<ICPUBuffer,ICPUDescriptorSet,ICPURenderpassIndependentPipeline,ICPUSkeleton >;
63
64
// knowing the position attribute ID is important for AABB computations etc.
64
65
uint32_t posAttrId : 5 ;
65
66
uint32_t normalAttrId : 5 ;
66
67
// by having one attribute only, we limit the number of bones per vertex to 4
67
68
uint32_t jointIDAttrId : 5 ;
68
69
uint32_t jointWeightAttrId : 5 ;
69
- uint32_t maxJointsPerVx : 3 ;
70
70
71
71
protected:
72
72
virtual ~ICPUMeshBuffer () = default ;
73
73
74
74
public:
75
75
// ! Default constructor (initializes pipeline, desc set and buffer bindings to nullptr)
76
- ICPUMeshBuffer () : base_t (nullptr , nullptr , nullptr , SBufferBinding<ICPUBuffer>{})
76
+ ICPUMeshBuffer () : base_t (nullptr , nullptr , nullptr , nullptr , SBufferBinding<ICPUBuffer>{})
77
77
{
78
78
posAttrId = 0u ;
79
79
normalAttrId = MAX_VERTEX_ATTRIB_COUNT;
80
80
jointIDAttrId = MAX_VERTEX_ATTRIB_COUNT;
81
81
jointWeightAttrId = MAX_VERTEX_ATTRIB_COUNT;
82
- maxJointsPerVx = 0u ;
83
82
}
84
83
using base_t ::base_t ;
85
84
@@ -94,6 +93,8 @@ class ICPUMeshBuffer : public IMeshBuffer<ICPUBuffer, ICPUDescriptorSet, ICPURen
94
93
clone_common (cp.get ());
95
94
cp->m_descriptorSet = (_depth > 0u && m_descriptorSet) ? core::smart_refctd_ptr_static_cast<ICPUDescriptorSet>(m_descriptorSet->clone (_depth - 1u )) : m_descriptorSet;
96
95
cp->m_pipeline = (_depth > 0u && m_pipeline) ? core::smart_refctd_ptr_static_cast<ICPURenderpassIndependentPipeline>(m_pipeline->clone (_depth - 1u )) : m_pipeline;
96
+ cp->m_skeleton = (_depth > 0u && m_skeleton) ? core::smart_refctd_ptr_static_cast<ICPUSkeleton>(m_skeleton->clone (_depth - 1u )) : m_skeleton;
97
+ cp->maxJointsPerVx = maxJointsPerVx;
97
98
98
99
cp->boundingBox = boundingBox;
99
100
cp->indexType = indexType;
@@ -107,7 +108,6 @@ class ICPUMeshBuffer : public IMeshBuffer<ICPUBuffer, ICPUDescriptorSet, ICPURen
107
108
cp->normalAttrId = normalAttrId;
108
109
cp->jointIDAttrId = jointIDAttrId;
109
110
cp->jointWeightAttrId = jointWeightAttrId;
110
- cp->maxJointsPerVx = maxJointsPerVx;
111
111
112
112
cp->m_indexBufferBinding .offset = m_indexBufferBinding.offset ;
113
113
cp->m_indexBufferBinding .buffer = (_depth > 0u && m_indexBufferBinding.buffer ) ?
@@ -136,6 +136,8 @@ class ICPUMeshBuffer : public IMeshBuffer<ICPUBuffer, ICPUDescriptorSet, ICPURen
136
136
m_vertexBufferBindings[i].buffer ->convertToDummyObject (referenceLevelsBelowToConvert);
137
137
if (m_indexBufferBinding.buffer )
138
138
m_indexBufferBinding.buffer ->convertToDummyObject (referenceLevelsBelowToConvert);
139
+ if (m_skeleton)
140
+ m_skeleton->convertToDummyObject (referenceLevelsBelowToConvert);
139
141
if (m_descriptorSet)
140
142
m_descriptorSet->convertToDummyObject (referenceLevelsBelowToConvert);
141
143
if (m_pipeline)
@@ -194,13 +196,30 @@ class ICPUMeshBuffer : public IMeshBuffer<ICPUBuffer, ICPUDescriptorSet, ICPURen
194
196
m_indexBufferBinding = std::move (bufferBinding);
195
197
}
196
198
199
+ // !
200
+ inline const ICPUSkeleton* getSkeleton () const
201
+ {
202
+ return base_t::getSkeleton ();
203
+ }
204
+ inline ICPUSkeleton* getSkeleton ()
205
+ {
206
+ assert (!isImmutable_debug ());
207
+ return m_skeleton.get ();
208
+ }
209
+ inline void setSkeleton (core::smart_refctd_ptr<ICPUSkeleton>&& skeleton)
210
+ {
211
+ assert (!isImmutable_debug ());
212
+ m_skeleton = std::move (skeleton);
213
+ }
214
+
197
215
// !
198
216
inline const ICPUDescriptorSet* getAttachedDescriptorSet () const
199
217
{
200
218
return base_t::getAttachedDescriptorSet ();
201
219
}
202
220
inline ICPUDescriptorSet* getAttachedDescriptorSet ()
203
221
{
222
+ // assert(!isImmutable_debug()); // TODO? @Crisspl?
204
223
return m_descriptorSet.get ();
205
224
}
206
225
inline void setAttachedDescriptorSet (core::smart_refctd_ptr<ICPUDescriptorSet>&& descriptorSet)
@@ -299,9 +318,6 @@ class ICPUMeshBuffer : public IMeshBuffer<ICPUBuffer, ICPUDescriptorSet, ICPURen
299
318
return core::min (safelyGetAttributeFormatChannelCount (jointIDAttrId),safelyGetAttributeFormatChannelCount (jointWeightAttrId)+1u );
300
319
}
301
320
302
- // ! Returns max joint influences
303
- inline uint32_t getMaxJointsPerVertex () const { return maxJointsPerVx; }
304
-
305
321
// ! Sets max joint influences
306
322
inline uint32_t setMaxJointsPerVertex (const uint32_t _maxJointsPerVx)
307
323
{
@@ -310,7 +326,7 @@ class ICPUMeshBuffer : public IMeshBuffer<ICPUBuffer, ICPUDescriptorSet, ICPURen
310
326
}
311
327
312
328
// ! Tells us if the mesh is skinned
313
- inline bool isSkinned () const { return deduceMaxJointsPerVertex ()> 0u && getMaxJointsPerVertex ()>0u ; }
329
+ inline bool isSkinned () const override { return base_t::isSkinned () && deduceMaxJointsPerVertex ()>0u ; }
314
330
315
331
// ! Get access to Indices.
316
332
/* * \return Pointer to indices array. */
@@ -636,15 +652,16 @@ class ICPUMeshBuffer : public IMeshBuffer<ICPUBuffer, ICPUDescriptorSet, ICPURen
636
652
return false ;
637
653
}
638
654
655
+ if ((!m_skeleton) != (!other->m_skeleton ))
656
+ return false ;
657
+ if (m_skeleton && !m_skeleton->canBeRestoredFrom (other->m_skeleton .get ()))
658
+ return false ;
659
+
639
660
if ((!m_descriptorSet) != (!other->m_descriptorSet ))
640
661
return false ;
641
662
if (m_descriptorSet && !m_descriptorSet->canBeRestoredFrom (other->m_descriptorSet .get ()))
642
663
return false ;
643
664
644
- /*
645
- if ((!m_pipeline || !other->m_pipeline) && m_pipeline != other->m_pipeline)
646
- return false;
647
- */
648
665
// pipeline is not optional
649
666
if (!m_pipeline->canBeRestoredFrom (other->m_pipeline .get ()))
650
667
return false ;
@@ -666,6 +683,9 @@ class ICPUMeshBuffer : public IMeshBuffer<ICPUBuffer, ICPUDescriptorSet, ICPURen
666
683
if (m_descriptorSet)
667
684
restoreFromDummy_impl_call (m_descriptorSet.get (), other->m_descriptorSet .get (), _levelsBelow);
668
685
686
+ if (m_skeleton)
687
+ restoreFromDummy_impl_call (m_skeleton.get (), other->m_skeleton .get (), _levelsBelow);
688
+
669
689
for (uint32_t i = 0u ; i < MAX_ATTR_BUF_BINDING_COUNT; ++i)
670
690
if (m_vertexBufferBindings[i].buffer )
671
691
restoreFromDummy_impl_call (m_vertexBufferBindings[i].buffer .get (), other->m_vertexBufferBindings [i].buffer .get (), _levelsBelow);
@@ -681,6 +701,8 @@ class ICPUMeshBuffer : public IMeshBuffer<ICPUBuffer, ICPUDescriptorSet, ICPURen
681
701
return true ;
682
702
if (m_descriptorSet && m_descriptorSet->isAnyDependencyDummy (_levelsBelow))
683
703
return true ;
704
+ if (m_skeleton && m_skeleton->isAnyDependencyDummy (_levelsBelow))
705
+ return true ;
684
706
685
707
for (uint32_t i = 0u ; i < MAX_ATTR_BUF_BINDING_COUNT; ++i)
686
708
if (m_vertexBufferBindings[i].buffer && m_vertexBufferBindings[i].buffer ->isAnyDependencyDummy (_levelsBelow))
0 commit comments