Skip to content

Commit 6930190

Browse files
Fix a few more issues
1 parent 9f0b73f commit 6930190

File tree

3 files changed

+58
-26
lines changed

3 files changed

+58
-26
lines changed

include/nbl/asset/ISkeleton.h

Lines changed: 51 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -75,27 +75,38 @@ namespace asset
7575
}
7676
virtual ~ISkeleton()
7777
{
78-
_NBL_DELETE_ARRAY(m_stringPool,m_stringPoolSize);
78+
clearNames();
79+
}
80+
81+
// map must contain one `const char*` per bone
82+
inline void setJointNames(const decltype(m_nameToJointID)& nameToJointIDMap)
83+
{
84+
clearNames();
85+
86+
// size the pool
87+
for (const auto& mapping : nameToJointIDMap)
88+
inName(mapping.first);
89+
90+
// useless names
91+
if (m_stringPoolSize==0ull)
92+
return;
93+
94+
m_stringPool = _NBL_NEW_ARRAY(char,m_stringPoolSize);
95+
96+
char* outName = m_stringPool;
97+
for (const auto& mapping : nameToJointIDMap)
98+
outName = insertName(outName,mapping.first,mapping.second);
7999
}
80100

81101
// iterator range must contain one `const char*` per bone
82102
template<typename NameIterator>
83103
inline void setJointNames(NameIterator begin, NameIterator end)
84104
{
85-
// deinit
86-
if (m_stringPool)
87-
_NBL_DELETE_ARRAY(m_stringPool,m_stringPoolSize);
88-
m_stringPoolSize = 0ull;
89-
m_nameToJointID.clear();
105+
clearNames();
90106

91107
// size the pool
92108
for (auto it=begin; it!=end; it++)
93-
{
94-
const char* inName = *it;
95-
const auto nameLen = strlen(inName);
96-
if (nameLen)
97-
m_stringPoolSize += nameLen+1ull;
98-
}
109+
inName(*it);
99110

100111
// useless names
101112
if (m_stringPoolSize==0ull)
@@ -106,24 +117,14 @@ namespace asset
106117
char* outName = m_stringPool;
107118
joint_id_t jointID = 0u;
108119
for (auto it=begin; it!=end; it++,jointID++)
109-
{
110-
const char* name = outName;
111-
112-
const char* inName = *it;
113-
while (*inName) {*(outName++) = *(inName++);}
114-
if (outName!=name)
115-
{
116-
*(outName++) = 0;
117-
m_nameToJointID.emplace(name,jointID);
118-
}
119-
}
120+
outName = insertName(outName,*it,jointID);
120121
}
121122

122123
struct StringComparator
123124
{
124125
inline bool operator()(const char* lhs, const char* rhs) const
125126
{
126-
return strcmp(lhs,rhs);
127+
return strcmp(lhs,rhs)<0;
127128
}
128129
};
129130
core::map<const char*,joint_id_t,StringComparator> m_nameToJointID;
@@ -132,6 +133,32 @@ namespace asset
132133

133134
SBufferBinding<BufferType> m_parentJointIDs,m_inverseBindPoses;
134135
joint_id_t m_jointCount;
136+
137+
private:
138+
inline void reserveName(const char* inName)
139+
{
140+
const auto nameLen = strlen(inName);
141+
if (nameLen)
142+
m_stringPoolSize += nameLen+1ull;
143+
}
144+
inline const char* insertName(const char* outName, const char* inName, joint_id_t jointID)
145+
{
146+
const char* name = outName;
147+
while (*inName) {*(outName++) = *(inName++);}
148+
if (outName!=name)
149+
{
150+
*(outName++) = 0;
151+
m_nameToJointID.emplace(name,jointID);
152+
}
153+
return outName;
154+
}
155+
inline void clearNames()
156+
{
157+
if (m_stringPool)
158+
_NBL_DELETE_ARRAY(m_stringPool,m_stringPoolSize);
159+
m_stringPoolSize = 0ull;
160+
m_nameToJointID.clear();
161+
}
135162
};
136163

137164
} // end namespace asset

include/nbl/video/IGPUObjectFromAssetConverter.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -421,8 +421,7 @@ auto IGPUObjectFromAssetConverter::create(const asset::ICPUSkeleton** _begin, co
421421
inverseBindPosesBinding.buffer = core::smart_refctd_ptr<IGPUBuffer>(gpubuf->getBuffer());
422422
}
423423

424-
const auto& nameMap = cpusk->getJointNameToIDMap();
425-
(*res)[i] = core::make_smart_refctd_ptr<IGPUSkeleton>(std::move(parentJointIDBinding),std::move(inverseBindPosesBinding),impl::CustomBoneNameIterator(nameMap.begin()),impl::CustomBoneNameIterator(nameMap.end()));
424+
(*res)[i] = core::make_smart_refctd_ptr<IGPUSkeleton>(std::move(parentJointIDBinding),std::move(inverseBindPosesBinding),cpusk->getJointNameToIDMap());
426425
}
427426

428427
return res;

include/nbl/video/IGPUSkeleton.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ class IGPUSkeleton final : public asset::ISkeleton<IGPUBuffer>
1818
using base_t = asset::ISkeleton<IGPUBuffer>;
1919

2020
public:
21+
inline IGPUSkeleton(asset::SBufferBinding<IGPUBuffer>&& _parentJointIDsBinding, asset::SBufferBinding<IGPUBuffer>&& _inverseBindPosesBinding, const decltype(m_nameToJointID)& nameToJointIDMap) :
22+
base_t(std::move(_parentJointIDsBinding),std::move(_inverseBindPosesBinding),nameToJointIDMap.size())
23+
{
24+
base_t::setJointNames(nameToJointIDMap);
25+
}
26+
2127
template<typename NameIterator>
2228
inline IGPUSkeleton(asset::SBufferBinding<IGPUBuffer>&& _parentJointIDsBinding, asset::SBufferBinding<IGPUBuffer>&& _inverseBindPosesBinding, NameIterator begin, NameIterator end) :
2329
base_t(std::move(_parentJointIDsBinding),std::move(_inverseBindPosesBinding),std::distance(begin,end))

0 commit comments

Comments
 (0)