@@ -87,16 +87,23 @@ class NBL_API2 CPolygonGeometryManipulator
87
87
if (!indexing) return nullptr ;
88
88
if (indexing->degree () != 3 ) return nullptr ;
89
89
90
+ const auto originalView = geo->getIndexView ();
90
91
const auto primCount = geo->getPrimitiveCount ();
91
92
const auto maxIndex = geo->getPositionView ().getElementCount () - 1 ;
92
93
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 ));
94
95
95
96
if (indexing && indexing->knownTopology () == EPT_TRIANGLE_LIST)
96
97
return outGeometry;
97
98
99
+
98
100
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 });
100
107
auto indexBufferPtr = indexBuffer->getPointer ();
101
108
auto indexView = ICPUPolygonGeometry::SDataView{
102
109
.composed = {
@@ -109,42 +116,49 @@ class NBL_API2 CPolygonGeometryManipulator
109
116
}
110
117
};
111
118
112
- if (indexSize == 2 )
119
+ switch (indexSize)
113
120
{
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 );
143
157
}
144
158
145
159
outGeo->setIndexing (IPolygonGeometryBase::TriangleList ());
146
160
outGeo->setIndexView (std::move (indexView));
147
- recomputeContentHashes (outGeo);
161
+ CGeometryManipulator::recomputeContentHash (outGeo-> getIndexView () );
148
162
149
163
return outGeometry;
150
164
}
0 commit comments