Skip to content

Commit c580d72

Browse files
author
kevyuu
committed
Move CanJoinVertices to CVertexWelder
1 parent a30ef6f commit c580d72

File tree

2 files changed

+105
-99
lines changed

2 files changed

+105
-99
lines changed

include/nbl/asset/utils/CVertexWelder.h

Lines changed: 104 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,110 @@ namespace nbl::asset {
1111
class CVertexWelder {
1212

1313
public:
14-
using WeldPredicateFn = std::function<bool(const ICPUPolygonGeometry* geom, uint64_t idx1, uint64_t idx2)>;
14+
using WeldPredicateFn = std::function<bool(const ICPUPolygonGeometry* geom, uint32_t idx1, uint32_t idx2)>;
15+
16+
class DefaultWeldPredicate
17+
{
18+
private:
19+
static bool isAttributeValEqual(const ICPUPolygonGeometry::SDataView& view, uint32_t index1, uint32_t index2, float epsilon)
20+
{
21+
if (!view) return true;
22+
const auto channelCount = getFormatChannelCount(view.composed.format);
23+
switch (view.composed.rangeFormat)
24+
{
25+
case IGeometryBase::EAABBFormat::U64:
26+
case IGeometryBase::EAABBFormat::U32:
27+
{
28+
hlsl::uint64_t4 val1, val2;
29+
view.decodeElement<hlsl::uint64_t4>(index1, val1);
30+
view.decodeElement<hlsl::uint64_t4>(index2, val2);
31+
for (auto channel_i = 0u; channel_i < channelCount; channel_i++)
32+
if (val1[channel_i] != val2[channel_i]) return false;
33+
break;
34+
}
35+
case IGeometryBase::EAABBFormat::S64:
36+
case IGeometryBase::EAABBFormat::S32:
37+
{
38+
hlsl::int64_t4 val1, val2;
39+
view.decodeElement<hlsl::int64_t4>(index1, val1);
40+
view.decodeElement<hlsl::int64_t4>(index2, val2);
41+
for (auto channel_i = 0u; channel_i < channelCount; channel_i++)
42+
if (val1[channel_i] != val2[channel_i]) return false;
43+
break;
44+
}
45+
default:
46+
{
47+
hlsl::float64_t4 val1, val2;
48+
view.decodeElement<hlsl::float64_t4>(index1, val1);
49+
view.decodeElement<hlsl::float64_t4>(index2, val2);
50+
for (auto channel_i = 0u; channel_i < channelCount; channel_i++)
51+
{
52+
const auto diff = abs(val1[channel_i] - val2[channel_i]);
53+
if (diff > epsilon) return false;
54+
}
55+
break;
56+
}
57+
}
58+
return true;
59+
}
60+
61+
static bool isAttributeDirEqual(const ICPUPolygonGeometry::SDataView& view, uint32_t index1, uint32_t index2, float epsilon)
62+
{
63+
if (!view) return true;
64+
const auto channelCount = getFormatChannelCount(view.composed.format);
65+
switch (view.composed.rangeFormat)
66+
{
67+
case IGeometryBase::EAABBFormat::U64:
68+
case IGeometryBase::EAABBFormat::U32:
69+
{
70+
hlsl::uint64_t4 val1, val2;
71+
view.decodeElement<hlsl::uint64_t4>(index1, val1);
72+
view.decodeElement<hlsl::uint64_t4>(index2, val2);
73+
return (1.0 - hlsl::dot(val1, val2)) < epsilon;
74+
}
75+
case IGeometryBase::EAABBFormat::S64:
76+
case IGeometryBase::EAABBFormat::S32:
77+
{
78+
hlsl::int64_t4 val1, val2;
79+
view.decodeElement<hlsl::int64_t4>(index1, val1);
80+
view.decodeElement<hlsl::int64_t4>(index2, val2);
81+
return (1.0 - hlsl::dot(val1, val2)) < epsilon;
82+
}
83+
default:
84+
{
85+
hlsl::float64_t4 val1, val2;
86+
view.decodeElement<hlsl::float64_t4>(index1, val1);
87+
view.decodeElement<hlsl::float64_t4>(index2, val2);
88+
return (1.0 - hlsl::dot(val1, val2)) < epsilon;
89+
}
90+
}
91+
return true;
92+
}
93+
94+
float m_epsilon;
95+
96+
public:
97+
98+
DefaultWeldPredicate(float epsilon) : m_epsilon(epsilon) {}
99+
100+
bool operator()(const ICPUPolygonGeometry* polygon, uint32_t index1, uint32_t index2)
101+
{
102+
if (!isAttributeValEqual(polygon->getPositionView(), index1, index2, m_epsilon))
103+
return false;
104+
if (!isAttributeDirEqual(polygon->getNormalView(), index1, index2, m_epsilon))
105+
return false;
106+
for (const auto& jointWeightView : polygon->getJointWeightViews())
107+
{
108+
if (!isAttributeValEqual(jointWeightView.indices, index1, index2, m_epsilon)) return false;
109+
if (!isAttributeValEqual(jointWeightView.weights, index1, index2, m_epsilon)) return false;
110+
}
111+
for (const auto& auxAttributeView : polygon->getAuxAttributeViews())
112+
if (!isAttributeValEqual(auxAttributeView, index1, index2, m_epsilon)) return false;
113+
114+
return true;
115+
}
116+
117+
};
15118

16119
template <typename AccelStructureT>
17120
static core::smart_refctd_ptr<ICPUPolygonGeometry> weldVertices(const ICPUPolygonGeometry* polygon, const AccelStructureT& as, WeldPredicateFn shouldWeldFn) {

src/nbl/asset/utils/CPolygonGeometryManipulator.cpp

Lines changed: 1 addition & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -136,86 +136,6 @@ core::smart_refctd_ptr<ICPUPolygonGeometry> CPolygonGeometryManipulator::createU
136136
return outGeometry;
137137
}
138138

139-
140-
namespace
141-
{
142-
bool isAttributeValEqual(const ICPUPolygonGeometry::SDataView& view, uint64_t index1, uint64_t index2, float epsilon)
143-
{
144-
if (!view) return true;
145-
const auto channelCount = getFormatChannelCount(view.composed.format);
146-
switch (view.composed.rangeFormat)
147-
{
148-
case IGeometryBase::EAABBFormat::U64:
149-
case IGeometryBase::EAABBFormat::U32:
150-
{
151-
hlsl::uint64_t4 val1, val2;
152-
view.decodeElement<hlsl::uint64_t4>(index1, val1);
153-
view.decodeElement<hlsl::uint64_t4>(index2, val2);
154-
for (auto channel_i = 0u; channel_i < channelCount; channel_i++)
155-
if (val1[channel_i] != val2[channel_i]) return false;
156-
break;
157-
}
158-
case IGeometryBase::EAABBFormat::S64:
159-
case IGeometryBase::EAABBFormat::S32:
160-
{
161-
hlsl::int64_t4 val1, val2;
162-
view.decodeElement<hlsl::int64_t4>(index1, val1);
163-
view.decodeElement<hlsl::int64_t4>(index2, val2);
164-
for (auto channel_i = 0u; channel_i < channelCount; channel_i++)
165-
if (val1[channel_i] != val2[channel_i]) return false;
166-
break;
167-
}
168-
default:
169-
{
170-
hlsl::float64_t4 val1, val2;
171-
view.decodeElement<hlsl::float64_t4>(index1, val1);
172-
view.decodeElement<hlsl::float64_t4>(index2, val2);
173-
for (auto channel_i = 0u; channel_i < channelCount; channel_i++)
174-
{
175-
const auto diff = abs(val1[channel_i] - val2[channel_i]);
176-
if (diff > epsilon) return false;
177-
}
178-
break;
179-
}
180-
}
181-
return true;
182-
}
183-
184-
bool isAttributeDirEqual(const ICPUPolygonGeometry::SDataView& view, uint64_t index1, uint64_t index2, float epsilon)
185-
{
186-
if (!view) return true;
187-
const auto channelCount = getFormatChannelCount(view.composed.format);
188-
switch (view.composed.rangeFormat)
189-
{
190-
case IGeometryBase::EAABBFormat::U64:
191-
case IGeometryBase::EAABBFormat::U32:
192-
{
193-
hlsl::uint64_t4 val1, val2;
194-
view.decodeElement<hlsl::uint64_t4>(index1, val1);
195-
view.decodeElement<hlsl::uint64_t4>(index2, val2);
196-
return (1.0 - hlsl::dot(val1, val2)) < epsilon;
197-
}
198-
case IGeometryBase::EAABBFormat::S64:
199-
case IGeometryBase::EAABBFormat::S32:
200-
{
201-
hlsl::int64_t4 val1, val2;
202-
view.decodeElement<hlsl::int64_t4>(index1, val1);
203-
view.decodeElement<hlsl::int64_t4>(index2, val2);
204-
return (1.0 - hlsl::dot(val1, val2)) < epsilon;
205-
}
206-
default:
207-
{
208-
hlsl::float64_t4 val1, val2;
209-
view.decodeElement<hlsl::float64_t4>(index1, val1);
210-
view.decodeElement<hlsl::float64_t4>(index2, val2);
211-
return (1.0 - hlsl::dot(val1, val2)) < epsilon;
212-
}
213-
}
214-
return true;
215-
}
216-
}
217-
218-
219139
core::smart_refctd_ptr<ICPUPolygonGeometry> CPolygonGeometryManipulator::createSmoothVertexNormal(const ICPUPolygonGeometry* inPolygon, bool enableWelding, float epsilon, VxCmpFunction vxcmp)
220140
{
221141
if (!inPolygon)
@@ -231,27 +151,10 @@ core::smart_refctd_ptr<ICPUPolygonGeometry> CPolygonGeometryManipulator::createS
231151
return nullptr;
232152
}
233153

234-
auto canJoinVertices = [epsilon](const ICPUPolygonGeometry* polygon, uint32_t index1, uint32_t index2)-> bool
235-
{
236-
if (!isAttributeValEqual(polygon->getPositionView(), index1, index2, epsilon))
237-
return false;
238-
if (!isAttributeDirEqual(polygon->getNormalView(), index1, index2, epsilon))
239-
return false;
240-
for (const auto& jointWeightView : polygon->getJointWeightViews())
241-
{
242-
if (!isAttributeValEqual(jointWeightView.indices, index1, index2, epsilon)) return false;
243-
if (!isAttributeValEqual(jointWeightView.weights, index1, index2, epsilon)) return false;
244-
}
245-
for (const auto& auxAttributeView : polygon->getAuxAttributeViews())
246-
if (!isAttributeValEqual(auxAttributeView, index1, index2, epsilon)) return false;
247-
248-
return true;
249-
};
250-
251154
auto result = CSmoothNormalGenerator::calculateNormals(inPolygon, epsilon, vxcmp);
252155
if (enableWelding)
253156
{
254-
return CVertexWelder::weldVertices(result.geom.get(), result.vertexHashGrid, canJoinVertices);
157+
return CVertexWelder::weldVertices(result.geom.get(), result.vertexHashGrid, CVertexWelder::DefaultWeldPredicate(epsilon));
255158
}
256159
return result.geom;
257160
}

0 commit comments

Comments
 (0)