Skip to content

Commit 9b09a91

Browse files
author
kevyuu
committed
Fix buffer usages, stylistic choice and magic number usages.
1 parent d658515 commit 9b09a91

File tree

1 file changed

+47
-33
lines changed

1 file changed

+47
-33
lines changed

include/nbl/asset/utils/CPolygonGeometryManipulator.h

Lines changed: 47 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -87,16 +87,23 @@ class NBL_API2 CPolygonGeometryManipulator
8787
if (!indexing) return nullptr;
8888
if (indexing->degree() != 3) return nullptr;
8989

90+
const auto originalView = geo->getIndexView();
9091
const auto primCount = geo->getPrimitiveCount();
9192
const auto maxIndex = geo->getPositionView().getElementCount() - 1;
9293
const uint8_t indexSize = maxIndex <= std::numeric_limits<uint16_t>::max() ? sizeof(uint16_t) : sizeof(uint32_t);
93-
const auto outGeometry = core::move_and_static_cast<ICPUPolygonGeometry>(geo->clone(0u));
94+
const auto outGeometry = core::move_and_static_cast<ICPUPolygonGeometry>(geo->clone(0u));
9495

9596
if (indexing && indexing->knownTopology() == EPT_TRIANGLE_LIST)
9697
return outGeometry;
9798

99+
98100
auto* outGeo = outGeometry.get();
99-
auto indexBuffer = ICPUBuffer::create({ primCount * 3 * indexSize, IBuffer::EUF_INDEX_BUFFER_BIT });
101+
const auto indexBufferUsages = [&]
102+
{
103+
if (originalView) return originalView.src.buffer->getUsageFlags();
104+
return IBuffer::EUF_INDEX_BUFFER_BIT;
105+
}();
106+
auto indexBuffer = ICPUBuffer::create({ primCount * indexing->degree() * indexSize, indexBufferUsages });
100107
auto indexBufferPtr = indexBuffer->getPointer();
101108
auto indexView = ICPUPolygonGeometry::SDataView{
102109
.composed = {
@@ -109,42 +116,49 @@ class NBL_API2 CPolygonGeometryManipulator
109116
}
110117
};
111118

112-
if (indexSize == 2)
119+
switch (indexSize)
113120
{
114-
IPolygonGeometryBase::IIndexingCallback::SContext<uint16_t> context{
115-
.indexBuffer = outGeo->getIndexView().getPointer(),
116-
.indexSize = indexSize,
117-
.beginPrimitive = 0,
118-
.endPrimitive = primCount,
119-
.out = indexBufferPtr,
120-
};
121-
indexing->operator()(context);
122-
123-
indexView.composed.encodedDataRange.u16.minVx[0] = 0;
124-
indexView.composed.encodedDataRange.u16.maxVx[0] = maxIndex;
125-
indexView.composed.format = EF_R16_UINT;
126-
indexView.composed.rangeFormat = IGeometryBase::EAABBFormat::U16;
127-
128-
} else
129-
{
130-
IPolygonGeometryBase::IIndexingCallback::SContext<uint32_t> context{
131-
.indexBuffer = outGeo->getIndexView().getPointer(),
132-
.indexSize = indexSize,
133-
.beginPrimitive = 0,
134-
.endPrimitive = primCount,
135-
.out = indexBufferPtr,
136-
};
137-
indexing->operator()(context);
138-
139-
indexView.composed.encodedDataRange.u32.minVx[0] = 0;
140-
indexView.composed.encodedDataRange.u32.maxVx[0] = maxIndex;
141-
indexView.composed.format = EF_R32_UINT;
142-
indexView.composed.rangeFormat = IGeometryBase::EAABBFormat::U32;
121+
case 2:
122+
{
123+
IPolygonGeometryBase::IIndexingCallback::SContext<uint16_t> context{
124+
.indexBuffer = geo->getIndexView().getPointer(),
125+
.indexSize = indexSize,
126+
.beginPrimitive = 0,
127+
.endPrimitive = primCount,
128+
.out = indexBufferPtr,
129+
};
130+
indexing->operator()(context);
131+
132+
indexView.composed.encodedDataRange.u16.minVx[0] = 0;
133+
indexView.composed.encodedDataRange.u16.maxVx[0] = maxIndex;
134+
indexView.composed.format = EF_R16_UINT;
135+
indexView.composed.rangeFormat = IGeometryBase::EAABBFormat::U16;
136+
break;
137+
}
138+
case 4:
139+
{
140+
IPolygonGeometryBase::IIndexingCallback::SContext<uint32_t> context{
141+
.indexBuffer = geo->getIndexView().getPointer(),
142+
.indexSize = indexSize,
143+
.beginPrimitive = 0,
144+
.endPrimitive = primCount,
145+
.out = indexBufferPtr,
146+
};
147+
indexing->operator()(context);
148+
149+
indexView.composed.encodedDataRange.u32.minVx[0] = 0;
150+
indexView.composed.encodedDataRange.u32.maxVx[0] = maxIndex;
151+
indexView.composed.format = EF_R32_UINT;
152+
indexView.composed.rangeFormat = IGeometryBase::EAABBFormat::U32;
153+
break;
154+
}
155+
default:
156+
assert(false);
143157
}
144158

145159
outGeo->setIndexing(IPolygonGeometryBase::TriangleList());
146160
outGeo->setIndexView(std::move(indexView));
147-
recomputeContentHashes(outGeo);
161+
CGeometryManipulator::recomputeContentHash(outGeo->getIndexView());
148162

149163
return outGeometry;
150164
}

0 commit comments

Comments
 (0)